Используя клиентский SDK C # .Net, я вызываю метод ExecuteStoredProcedureAsync следующим образом:
sproc_response = await client.ExecuteStoredProcedureAsync<Document>(sproc_uri, new RequestOptions { PartitionKey = new PartitionKey( my_partition_key) }, doc_to_create );
Код хранимой процедуры выглядит следующим образом:
sproc.Body = @"function( doc ) {
var collection = getContext().getCollection();
var response = getContext().getResponse();
function create_doc_callback( err, doc_created, options ) {
if(err) throw new Error('Error creating document: ' + err.message);
response.setBody( doc_created );
}
collection.createDocument( collection.getSelfLink(), doc, {}, create_doc_callback );
}";
Это ВСЕГДА приводит к возникновению следующего исключения:
Ошибка при создании документа: запросы, исходящие из сценариев, не могут ссылаться на ключи раздела, кроме того, для которого был отправлен запрос клиента.
Есть ли какая-либо документация или пример, который ясно показывает, как вызвать хранимую процедуру с использованием ключа раздела - очевидно, мне что-то не хватает!
1 ответ
Когда вы создаете секционированную коллекцию в Cosmos, вам необходимо выбрать ключ секции, который является путем в представлении JSON ваших документов, который будет использоваться для размещения документа в правильном разделе. Если вы пытаетесь вставить документ без ключа раздела, он будет сгруппирован в специальный раздел для документов без ключа раздела. Вы указываете, что хранимая процедура должна выполняться в контексте данного раздела, но затем пытаетесь использовать ее для вставки документа в другой раздел (неопределенный). Убедитесь, что на вашем POCO есть свойство, которое соответствует значению, которое вы выбрали для ключа раздела в вашей коллекции.
Вы четко знаете, в какой раздел вы хотите поместить документ, поскольку вы передаете значение в RequestOptions для PartitionKey. Теперь убедитесь, что ваш POCO включает это значение в свойство, которое соответствует ключу раздела, который вы выбрали при создании своей коллекции. У документа по-прежнему будет автоматически сгенерированный идентификатор, если вы его не предоставите. В качестве альтернативы вы можете просто добавить ключ раздела в свой документ внутри Sproc, когда вы имеете дело с динамическим JS-объектом.
doc.partitionKey = my_partition_key
Похожие вопросы
Связанные вопросы
Новые вопросы
.net
НЕ используйте для вопросов о .NET Core - используйте вместо этого [.net-core]. .NET Framework - это программная среда, предназначенная главным образом для операционной системы Microsoft Windows. Он включает в себя реализацию библиотеки базовых классов, общеязыковой среды выполнения (обычно называемой CLR), общей системы типов (обычно называемой CTS) и динамической среды исполнения. Он поддерживает множество языков программирования, включая C #, VB.NET, F # и C ++ / CLI.
doc_to_create
. Возможно ли, что оно отличается от значения, которое вы передаете для ключа раздела в параметрах запроса?