.NET 中对所有类添加 IgnoreExtraElements 属性

在将 mongodb 中的数据映射到类的时候,当 mongodb 中的字段与定义的实体类的字段不一样时,会报错,此时只需要在类上添加 BsonIgnoreExtraElements 特性,即可解决。

正文

假设有如下 mongodb 数据:

1
2
3
4
5
6
7
8
9
10
11
[
{
"Name": "zhangsan",
"Age": 20,
"Gender": "男"
},
{
"Name": "xiaofang",
"Age": 18
}
]

数据库对应的类的定义为:

1
2
3
4
5
6
[BsonIgnoreExtraElements]
public calss Person
{
public string Name{get;set;}
public int Age{get;set;}
}

为了使 mongodb 在映射到 Person 时不报错,要在 Person 上添加 [BsonIgnoreExtraElements] 特性。

BsonIgnoreExtraElements 位于命名空间 MongoDB.Bson.Serialization.Attributes 中

这种方式有个弊端,如果要在每一个类上添加 [BsonIgnoreExtraElements],那写代码时简直难受,且代码侵入性很大。

有没有办法将 BsonIgnoreExtraElements 应用于所有的类呢?

当然有,其方法如下,只需要在初始化 MongoClient 之前运行一次如下代码即可。该设置是单例的,下次初始化时就不需要运行了。

1
2
3
4
5
// mongodb 全局设置
var pack = new ConventionPack();
// 在反序列化时,忽略多出的字段
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));

ConventionPack 位于命名空间 MongoDB.Bson.Serialization.Conventions 中

  • IgnoreExtraElementsConvention:忽略库中有但是类中没有定义的字段。这个一般用于敏感字段处理,例如密码字段,它会存在用户 Collection 中,但是这个字段只是登录校验的时候会用到(这时可以用js来查询),其他用户查询(linq查询)基本都不需要用到密码字段。

  • IgnoreIfNullConvention:如果字段 null,则不存这个字段,简单来说就是省空间,假设一个类中有 A,B 两个字段,其中 A 字段为空,如果指定该设置,存为 {B:'B'},否则,存为 {A:null, B:'B'}

参考

  1. MongoDB系列(二):C#应用

  2. MongoDB C#驱动程序 - 忽略绑定上的字段