我正在使用官方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属性,然后将其返回到控制器,而不是将对象映射到视图模型。
希望我的问题有道理。谢谢!
答案 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);