#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 Возможных решения:
- Используйте
Newtonsoft.Json
вместоSystem.Text.Json
. - Настройте 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. Не беспокойтесь. Я обновил свой ответ. Пожалуйста, не забудьте прочитать и это.