MongoDB c# 驱动程序:如何为类中的所有成员设置 SetIgnoreIfDefault

Avi*_*iko 4 c# mongodb mongodb-csharp-2.0 mongodb-.net-driver

我想为类的所有属性设置 SetIgnoreIfDefault(true)。(这可以在存储中保存 TONS 的默认数据)

我可以为每个属性显式调用 SetIgnoreIfDefault:

    BsonClassMap.RegisterClassMap<MyClass>(cm =>
    {
        cm.AutoMap();
        cm.MapProperty(x => x.A).SetIgnoreIfDefault(true);
        cm.MapProperty(x => x.B).SetIgnoreIfDefault(true);
        cm.MapProperty(x => x.C).SetIgnoreIfDefault(true);
        cm.MapProperty(x => x.D).SetIgnoreIfDefault(true);
        cm.MapProperty(x => x.E).SetIgnoreIfDefault(true);
        ...
        cm.SetIgnoreExtraElements(true);
    });
Run Code Online (Sandbox Code Playgroud)

但是我有很多类和很多属性,如果我修改了类,我需要记住更改注册。

有没有办法在一次调用中为类的所有属性设置它?

有没有办法在全局范围内为所有属性设置它?

谢谢

Cod*_*ler 6

有没有办法在一次调用中为类的所有属性设置它?

有没有办法在全局范围内为所有属性设置它?

您可以使用自定义成员映射约定轻松实现这一点。

这是一个示例约定,它忽略所有类的具有默认值的属性:

public class IgnoreDefaultPropertiesConvention : IMemberMapConvention
{
    public string Name => "Ignore default properties for all classes";

    public void Apply(BsonMemberMap memberMap)
    {
        memberMap.SetIgnoreIfDefault(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是特定类的约定:

public class IgnoreDefaultPropertiesConvention<T> : IMemberMapConvention
{
    public string Name  => $"Ignore Default Properties for {typeof(T)}";

    public void Apply(BsonMemberMap memberMap)
    {
        if (typeof(T) == memberMap.ClassMap.ClassType)
        {
            memberMap.SetIgnoreIfDefault(true);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式注册自定义约定(在向 MongoDB 发出任何请求之前):

var pack = new ConventionPack
{
    new IgnoreDefaultPropertiesConvention()
};
ConventionRegistry.Register("Custom Conventions", pack, t => true);
Run Code Online (Sandbox Code Playgroud)