You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 05:36:01