MongoDB .NET绑定模型类时无法读取Integer类型id值的问题
问题描述
MongoDB中存在一个名为transaction的集合,文档结构如下:
{ "approverSpv": { "id": 176, "isApproved": true }, "approverManager": { "id": 176, "isApproved": true } }
为读取审批人id字段,创建了对应的C#模型类:
public class ApproverManager { public int id { get; set; } public bool isApproved { get; set; } } public class ApproverSpv { public int id { get; set; } public bool isApproved { get; set; } } public class Transaction { public ApproverSpv approverSpv { get; set; } public ApproverManager approverManager { get; set; } }
使用以下代码查询数据:
var transactionParts = database.GetCollection<Transaction>("transaction").AsQueryable<Transaction>().ToList();
查询结果中isApproved能正确获取值,但ApproverSpv和ApproverManager中的id始终为0,如何解决?
解决方案
问题根源是MongoDB .NET驱动的默认序列化规则:驱动会将C#类中的id属性默认识别为MongoDB的主键_id,而非文档中的普通id字段,导致映射失败。
有两种可行的解决方式:
方法一:使用[BsonElement]特性指定字段映射
在模型类的id属性上添加特性,明确指定要映射的MongoDB字段名:
using MongoDB.Bson.Serialization.Attributes; public class ApproverManager { [BsonElement("id")] public int id { get; set; } public bool isApproved { get; set; } } public class ApproverSpv { [BsonElement("id")] public int id { get; set; } public bool isApproved { get; set; } } public class Transaction { public ApproverSpv approverSpv { get; set; } public ApproverManager approverManager { get; set; } }
方法二:全局配置驱动的字段映射规则
如果不想逐个添加特性,可以在程序启动时全局配置驱动的命名策略,并单独修正id字段的映射逻辑:
using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Conventions; // 全局配置驼峰命名映射 var conventionPack = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", conventionPack, t => true); // 单独配置ApproverSpv和ApproverManager的id字段 BsonClassMap.RegisterClassMap<ApproverSpv>(cm => { cm.AutoMap(); cm.MapField(c => c.id).SetElementName("id"); }); BsonClassMap.RegisterClassMap<ApproverManager>(cm => { cm.AutoMap(); cm.MapField(c => c.id).SetElementName("id"); });
两种方式都能让驱动正确将MongoDB文档中的id字段映射到C#模型的id属性,获取到实际的数值。
内容的提问来源于stack exchange,提问作者RANDY
相关产品推荐
相关产品推荐

