升级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
相关产品推荐
相关产品推荐

