MongoDB多大小写属性名如何映射到C#自定义类?
有多种方案可以实现多大小写属性名的适配,可根据你的实际场景选择:
方案1:手动为属性添加别名(最可控,适合少量属性场景)
使用MongoDB C#驱动提供的AddAlternateElementName方法,可为单个C#属性绑定任意多个对应MongoDB文档的字段名:
// 应用启动时注册类映射一次即可 BsonClassMap.RegisterClassMap<MyClass>(cm => { cm.AutoMap(); // 绑定Prop1对应的所有大小写变体字段 cm.MapMember(c => c.Prop1) .SetElementName("Prop1") // 序列化回数据库时默认使用的字段名 .AddAlternateElementName("prop1") .AddAlternateElementName("PROP1"); // 绑定Prop2对应的所有大小写变体字段 cm.MapMember(c => c.Prop2) .SetElementName("Prop2") .AddAlternateElementName("prop2") .AddAlternateElementName("proP2") .AddAlternateElementName("ProP2"); });
映射时只要MongoDB文档的字段匹配任意一个别名,就会自动赋值到对应的C#属性。
方案2:全局配置不区分大小写匹配(最省事,适合全项目通用场景)
如果项目内大量数据集都存在属性名大小写不统一的问题,可以注册全局约定实现所有属性自动忽略大小写匹配:
// 应用启动时注册一次即可 ConventionRegistry.Register( "IgnoreCasePropertyMapping", new ConventionPack { new IgnoreCaseElementNameConvention() }, type => true // 可在此处过滤仅对特定类生效,比如type == typeof(MyClass) );
方案3:自定义约定批量生成别名(适合多类多属性场景)
如果需要适配的大小写变体有固定规则(比如全小写、全大写、驼峰等),可以自定义约定自动为所有属性批量添加别名,不用手动逐个配置:
// 自定义不区分大小写的映射约定 public class CaseInsensitiveElementNameConvention : IMemberMapConvention { public string Name => "CaseInsensitiveElementName"; public void Apply(BsonMemberMap memberMap) { // 按需添加你需要适配的大小写变体 var propName = memberMap.MemberName; memberMap.AddAlternateElementName(propName.ToLower()); memberMap.AddAlternateElementName(propName.ToUpper()); } } // 注册约定 ConventionRegistry.Register( "CustomCaseInsensitiveMapping", new ConventionPack { new CaseInsensitiveElementNameConvention() }, type => type == typeof(MyClass) // 调整过滤条件控制生效范围 );
注意:序列化回写数据库时,默认会使用
SetElementName指定的字段名写入,如果你需要保留原有文档的字段名不变,仅做读取映射,以上方案均不受影响。
内容的提问来源于stack exchange,提问作者CeejeeB
相关产品推荐
相关产品推荐

