Azure C# Cosmos DB 已配置id属性仍提示缺失问题求助
问题原因
- 核心原因是序列化特性不匹配:Azure Cosmos DB .NET V3 SDK 默认使用 Newtonsoft.Json 作为序列化组件,你代码中使用的
[JsonPropertyName("id")]是System.Text.Json库的特性,Newtonsoft.Json 无法识别该注解,序列化后生成的字段名仍为Id(大写I开头),而非Cosmos DB要求的小写id,因此触发字段缺失报错。 - 次要排查点:确认你在调用
CreateItemAsync前,已经给Article实例的Id属性完成了赋值,虽然你传入分区键时用到了article.Id,但仍需避免Guid默认全零值的异常情况。
验证小技巧:你可以提前序列化
Article实例,查看输出的JSON结构是否包含小写id字段,快速确认序列化配置是否生效。
解决方案
方案1:替换为Newtonsoft.Json的序列化特性(推荐,改动最小)
修改Article类的注解,引用Newtonsoft.Json的JsonProperty特性即可:
using Newtonsoft.Json; public partial class Article { [JsonProperty("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; } }
方案2:配置Cosmos SDK使用System.Text.Json序列化
如果你项目整体使用System.Text.Json作为统一序列化组件,可以在初始化CosmosClient时指定序列化器,原本的[JsonPropertyName("id")]注解即可正常生效:
using Azure.Core.Serialization; using System.Text.Json; var clientOptions = new CosmosClientOptions { Serializer = new SystemTextJsonCosmosSerializer(new JsonSerializerOptions(JsonSerializerDefaults.Web)) }; var cosmosClient = new CosmosClient("你的Cosmos连接字符串", clientOptions);
方案3:直接修改属性名(不推荐,不符合C#命名规范)
如果不想修改序列化配置,也可以直接把属性名改为小写id,不需要加任何序列化特性即可兼容:
public Guid id { get; set; }
内容的提问来源于stack exchange,提问作者Rogerio Cruz
相关产品推荐
相关产品推荐

