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

升级MongoDB .NET Driver后嵌套Product类id属性无法赋值问题排查

MongoDB C#驱动升级后嵌套类id属性无法赋值解决方案

问题根因

你所使用的2021年8月发布的MongoDB C#驱动为v2.13版本,该版本调整了实体映射约定的优先级:默认会将类中命名为id/Id/_id的属性自动识别为该实体对应文档的_id主键字段,优先级高于你配置的[BsonElement]特性。
由于你的嵌套Product对象在MongoDB文档中仅存在普通字段id,不存在主键字段_id,因此驱动找不到对应的值赋值给Product.id属性,而StockQuantity没有触发该约定,所以可以正常映射。

修复方案

方案1:添加[BsonNoId]特性(推荐)

直接在Product类的id属性上添加[BsonNoId]特性,明确告知驱动该属性不是主键字段,即可按照你配置的[BsonElement("id")]正常映射:

[BsonIgnoreExtraElements]
public class Product {        
    [BsonNoId]
    [BsonElement("id")]
    public int id {
        get;
        set;
    }

    [BsonElement("stock_quantity")]
    public int StockQuantity {
        get;
        set;
    }
}

该方案仅影响当前Product类,无全局副作用。

方案2:修改属性名

将Product类的id属性修改为不触发主键约定的名称,比如ProductId,保持[BsonElement("id")]配置不变即可:

[BsonElement("id")]
public int ProductId { get; set; }

方案3:全局关闭主键自动映射约定

如果你的业务场景下不需要驱动自动识别主键字段,可以在程序启动阶段全局移除默认的Id映射约定:

using MongoDB.Bson.Serialization.Conventions;

// 全局配置仅需执行一次
var conventionPack = new ConventionPack();
conventionPack.Remove(new IdMemberConvention());
ConventionRegistry.Register("DisableAutoIdMapping", conventionPack, type => true);

注意该方案全局生效,后续所有实体的主键都需要手动添加[BsonId]特性标注,否则无法正常映射_id字段。


内容的提问来源于stack exchange,提问作者steakoverflow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:06:02