MongoDB .NET Driver类映射值为null/默认值问题及配置位置问询
问题解答
1. 类映射不生效的原因
核心原因是完全手动映射模式下未显式匹配字段名:MongoDB .NET Driver 只有在调用AutoMap()时才会应用内置约定(比如自动将Id属性映射到MongoDB默认主键_id、应用命名大小写转换规则等)。你直接调用MapMember注册属性时,驱动会默认用C#属性的精确名称去匹配集合中的字段:
- 主键
Id会尝试匹配集合中名为Id的字段,而非MongoDB默认的_id字段,自然无法读取到值 - 其余属性如果和集合中实际存储的字段存在大小写、命名差异(比如集合存的是
userId、created,你的属性是UserID、Created),也会匹配失败,最终返回对应类型的默认值(string为null、DateTime为最小值、枚举为0值)
你不需要完全放弃AutoMap来排除file字段,可以先调用AutoMap()应用默认约定,再调用UnmapMember移除不需要的字段即可,比全手动映射更简洁不易出错,示例如下:
BsonClassMap.RegisterClassMap<PhotoModel>(cm => { cm.AutoMap(); // 应用所有默认约定 cm.UnmapMember(c => c.File); // 排除不需要映射的file字段 });
如果要保留完全手动映射的写法,需要给每个成员显式指定对应的Bson字段名:
BsonClassMap.RegisterClassMap<PhotoModel>(cm => { cm.MapMember(c => c.Id).SetElementName("_id"); cm.MapMember(c => c.Name).SetElementName("name"); cm.MapMember(c => c.Description).SetElementName("description"); cm.MapMember(c => c.Category).SetElementName("category"); cm.MapMember(c => c.UserID).SetElementName("userId"); cm.MapMember(c => c.Created).SetElementName("created"); });
2. 类映射注册位置合理性说明
你当前在Program.cs主机构建运行前执行注册的位置是完全合理的。
官方要求类映射必须在第一次触发MongoDB驱动操作之前完成,包括MongoClient初始化、第一次集合查询等操作。主机构建前的注册时机早于服务注册阶段的MongoClient初始化,也早于所有后续的数据库访问逻辑,完全符合要求,不会出现注册时机太晚的问题。
内容的提问来源于stack exchange,提问作者Anthony Bias
相关产品推荐
相关产品推荐

