#.net-core #azure-cosmosdb #azure-cosmosdb-sqlapi
#.net-core #azure-cosmosdb #azure-cosmosdb-sqlapi
Вопрос:
Попытка выполнить обновление элементов в Cosmos DB из консольного приложения .NET Core 3.1 в Windows 10 с помощью C #.
Документ JSON выглядит следующим образом:
{
"id": "25217f96-d399-4bb7-b8f1-4a7365cca76c",
"title": "my title",
"eventUtc": "2020-09-04T14:16:04 0000" ,
"listOne":
[
{"person1" : "james" , "contributorContact" : "" , "contributorTtype" : "contributor"} ,
{"person2" : "veena" , "contributorContact" : "" , "contributorTtype" : "contributor"}
]
,
"listTwo" :
[
"lorem" , "ipsum" , "dolor"
] ,
"synopsis" : "abcdefghi." }
Этот документ не существует в контейнере, но контейнер уже существует с одним другим документом. Ключом раздела является «id».
Этот код завершается ошибкой: …
foreach (var fileOne in Directory.GetFiles(fileLoc))
{
MemoryStream stream = new MemoryStream();
await System.Text.Json.JsonSerializer.SerializeAsync(stream, File.ReadAllText(fileOne));
var response = await cosmosContainer.UpsertItemStreamAsync(stream, new PartitionKey("id"));
}
Файлов не так много, поэтому требуется их обновление по отдельности.
Сообщение об ошибке:
Код состояния ответа не указывает на успех: BadRequest (400); Substatus: 0; ActivityId: 9c545c05-102f-4ed5-9c6c-e5092ae1671b; Причина: (Сообщение: {«Ошибки»: [«Один из указанных входных данных недействителен»]}….
Где ошибка в коде? На основе https://github.com/Azure/azure-cosmos-dotnet-v3/issues/1463 Я думал, это сработает.
Спасибо.
Ответ №1:
В предоставленном вами коде создается впечатление, что вы отправляете имя ключа раздела «id», а не имя id
элемента. Это должно выглядеть так:
foreach (var fileOne in Directory.GetFiles(fileLoc))
{
MemoryStream stream = new MemoryStream();
await System.Text.Json.JsonSerializer.SerializeAsync(stream, File.ReadAllText(fileOne));
string itemId = // Extract ID from item
var response = await cosmosContainer.UpsertItemStreamAsync(stream, new PartitionKey(itemId));
}
Обратите внимание на использование разрешенного itemId
при предоставлении ключа раздела. Кроме того, вам, вероятно, нужен using
оператор с вашим экземпляром MemoryStream.
Комментарии:
1. Этот код возвращает ошибку «BadRequest (400); Substatus: 0; (Сообщение: {«Ошибки»: [«Один из указанных входных данных неверен»]}» var ItemId = «25217f96-d399-4bb7-b8f1-4a7365cca76c»; используя (var MemoryStream = new MemoryStream() ){ ожидание JsonSerializer. SerializeAsync(MemoryStream, File. ReadAllText(FileOne)); MemoryStream. Искать (0, SeekOrigin.Begin); ответ var = ожидает cosmosContainer. UpsertItemStreamAsync(MemoryStream , новый ключ раздела (ItemId)); }
2. Я бы с подозрением относился к необработанным данным и сначала десериализовал их в типизированный объект, прежде чем использовать его в качестве элемента для обновления. Таким образом, вы можете проверить, правильно ли оно прочитано.
3. Я создал тип и украсил его атрибутами Newtonsoft и использовал десериализатор Newtonsoft, а затем элементы были вставлены нормально. Я надеялся, что для ускорения превращения файла в строку в объект для вставки не потребуется, поскольку, если я получу доступ к порталу Azure и скопирую текст документа, он просто вставится нормально. Ну что ж. Спасибо за помощь!