MongoDB C#驱动程序:忽略插入时的属性

时间:2011-02-03 23:07:31

标签: c# mongodb mongodb-.net-driver

我正在使用官方MongoDB C#Drive v0.9.1.26831,但我想知道给定一个POCO类,无论如何都要忽略某些属性插入。

例如,我有以下课程:

public class GroceryList
{
    public string Name { get; set; }
    public FacebookList Owner { get; set; }
    public bool IsOwner { get; set; }
}

当我插入GroceryList对象时,有没有办法让 IsOwner 插入? 基本上,我从数据库中获取对象,然后在应用程序层中设置IsOwner属性,然后将其返回到控制器,而不是将对象映射到视图模型。

希望我的问题有道理。谢谢!

5 个答案:

答案 0 :(得分:51)

看起来[BsonIgnore]属性完成了这项工作。

public class GroceryList : MongoEntity<ObjectId>
{
    public FacebookList Owner { get; set; }
    [BsonIgnore]
    public bool IsOwner { get; set; }
}

答案 1 :(得分:14)

你也可以使IsOwner Nullable并将[BsonIgnoreExtraElements]添加到孔类中:

[BsonIgnoreExtraElements]
public class GroceryList : MongoEntity<ObjectId>
{
    public FacebookList Owner { get; set; }
    public bool? IsOwner { get; set; }
}

在诽谤期间,将忽略具有空值的属性。 但我认为[BsonIgnore]会更适合你的情况。

答案 2 :(得分:11)

或者,如果您因某些原因不想使用该属性(例如,如果您不想为{DTO}带来额外的依赖关系{+ 1}},您可以这样做以下内容:

MongoDB.Bson

答案 3 :(得分:4)

您可能希望将两个属性BsonIgnoreExtraElements和BsonIgnore 组合在一起。 原因是虽然BsonIgnore不会向您的数据库插入“IsOwner”属性,但如果您的数据库中有“旧”实例包含此字段,您将从该模型中删除该字段中的这些字段或扩展您的“GroceryList” “在DB中使用你的新类并将获得例外:

  

“元素'IsOwner'与类的任何字段或属性都不匹配。”

另一种方式(而不是编辑模型类)是将“注册类地图”与“ SetIgnoreExtraElements”和“UnmapMember”一起使用。

在您的情况下,只需在初始化驱动程序时添加此代码:

BsonClassMap.RegisterClassMap<UserModel>(cm =>
{
     cm.AutoMap();
     cm.SetIgnoreExtraElements(true);
     cm.UnmapMember(m => m.IsOwner);
});

您可以在以下位置阅读有关Mongo类映射的更多信息:

http://mongodb.github.io/mongo-csharp-driver/2.0/reference/bson/mapping/

答案 4 :(得分:3)

以防万一有人可能对另一种方式感兴趣。通过惯例:

public class IgnoreSomePropertyConvention : ConventionBase, IMemberMapConvention
{
    public void Apply(BsonMemberMap memberMap)
    { // more checks will go here for the case above, e.g. type check
        if (memberMap.MemberName != "DoNotWantToSaveThis")
            memberMap.SetShouldSerializeMethod(o => false);
    }
}

然后你需要在应用启动期间注册一次这个约定:

ConventionRegistry.Register("MyConventions", new ConventionPack { new IgnoreBaseIdConvention()  }, t => true);