Azure C# Cosmos DB: свойство «идентификатор» отсутствует, когда оно действительно присутствует

#c# #.net #azure #azure-cosmosdb

Вопрос:

Сейчас я начинаю работать с CosmosDB, и при попытке вставить некоторые данные в базу данных я сталкиваюсь со следующей ошибкой:

 The input content is invalid because the required properties - 'id; ' - are missing.
 

Я понимаю, что в моем документе должно быть вызванное string поле id , но ошибка сохраняется даже после того, как я добавляю [JsonPropertyName("id")] в качестве аннотации Id поле моего объекта.

Вот звонок в CosmosDB:

 var insertionResponse = await container.CreateItemAsync<Article>(
    item: article,
    partitionKey: new PartitionKey(article.Id.ToString())
);
 

А вот Article и класс:

 public partial class Article
{
    [JsonPropertyName("id")]
    public Guid Id { get; set; }
    public Guid CreatedBy { get; set; }
    public DateTime CreatedOn { get; set; }

    public string Title { get; set; }
    public string Body { get; set; }
}
 

Есть какие-нибудь идеи, почему это происходит?

Комментарии:

1. Попробуйте перейти Id с Guid на String .

2. @DavidMakogon попробовал это, я получаю точно такое же поведение. Кроме того, при использовании System.Text.Json сериализация преобразует Guid s в string s.

3. Какую версию SDK вы используете?

4. @GauravMantri Я использую dotnet 5.0.301 на своей машине, но этот конкретный фрагмент кода нацелен на dotnet 3.1, поскольку он находится внутри функции Azure.

5. Извините, я имел в виду версию Cosmos DB SDK.

Ответ №1:

Проблема возникает из-за различных библиотек JSON, используемых вашим кодом и SDK. Ваш код использует System.Text.Json , в то время как SDK Newtonsoft.Json по умолчанию использует сериализацию/десериализацию. Из-за этого SDK не понимает [JsonPropertyName("id")] атрибут и не сериализует документ должным образом.

2 Возможных решения:

  1. Используйте Newtonsoft.Json вместо System.Text.Json .
  2. Настройте SDK для использования System.Text.Json для сериализации/десериализации. Пожалуйста, смотрите эту ссылку для получения более подробной информации: https://github.com/ealsur/ondotnet-cosmosdb/tree/master/src/episode1/customserializer.

Обновить

Не так давно я столкнулся с точно такой же проблемой и обратился к одному из членов команды Cosmos DB SDK. Он указал мне на ссылку, которой я поделился в № 2 выше. Предостережение, о котором он упомянул, заключается в том, что использование System.Text.Json может не сработать, если вы используете запросы LINQ.

Другой альтернативой (хотя и не рекомендуется) является использование версии 4 пакета SDK Cosmos DB, в котором используется System.Text.Json по умолчанию. В настоящее время он находится в предварительном просмотре, и, согласно комментариям команды SDK, на дату выпуска нет ETA. Кроме того, на данный момент не все функции, доступные в SDK версии 3, доступны в версии 4 (следовательно, комментарий «не рекомендуется» выше).

ОБНОВЛЕНИЕ 2

Существует лучшая реализация (чем та, которой я поделился ранее в № 2) использования System.Text.Json с версией v3 пакета SDK Cosmos DB. Пожалуйста, смотрите эту ссылку для получения более подробной информации: https://github.com/Azure/azure-cosmos-dotnet-v3/tree/master/Microsoft.Лазурь.Космос.Примеры/Использование/SystemTextJson.

Комментарии:

1. Это решило мою проблему! Я не думал, что разные сериализаторы повлияют на это. Спасибо за помощь!

2. Не беспокойтесь. Я обновил свой ответ. Пожалуйста, не забудьте прочитать и это.