Сбой обновления Cosmos DB

#.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 и скопирую текст документа, он просто вставится нормально. Ну что ж. Спасибо за помощь!