实现所有类BsonIgnoreExtraElements

时间:2012-10-17 22:42:04

标签: c# mongodb

我在MongoDrive中使用mongDb,我想知道如何在我的所有课程中实现 [BsonIgnoreExtraElements]

我知道有一种方法可以通过 ConventionProfile ,但我不知道如何实现它。

2 个答案:

答案 0 :(得分:26)

使用SetIgnoreExtraElementsConvention方法(来自C#驱动程序的{em>约定部分Serialization Tutorial):

var myConventions = new ConventionProfile();
myConventions.SetIgnoreExtraElementsConvention(new AlwaysIgnoreExtraElementsConvention()));
BsonClassMap.RegisterConventions(myConventions, (type) => true);

参数(type) => true是一个谓词,取决于类类型,它决定是否应用约定。因此,根据您的要求,它应该简单地返回true;但如果需要,可以使用它来设置/排除给定类型的约定。

修改

根据Evereq的评论,上述内容已经过时。现在使用:

var conventionPack = new ConventionPack { new IgnoreExtraElementsConvention(true) };
ConventionRegistry.Register("IgnoreExtraElements", conventionPack, type => true);

答案 1 :(得分:2)

基本上,

mongoDB使您能够将文档存储在单个集合中,每个集合都可以拥有自己的模式。如果您具有关系数据库的背景,那么这是一个重大变化。在关系数据库中,每个表都有一个静态模式,如果不更改表的结构,则不能偏离。 在下面的示例中,我定义了一个Person类和一个派生自Person类的PersonWithBirthDate类。这些都可以存储在mongoDB数据库的同一集合中。在这种情况下,假设文档存储在Persons集合中。

参见示例代码 -

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class PersonWithBirthDate : Person
{
    public DateTime DateOfBirth { get; set; }
}

现在,您可以轻松检索文档,并让mongoDB C#驱动程序将文档反序列化为PersonWithBirthDate类。但是,如果查询Persons集合并尝试让驱动程序将数据反序列化为Person类,则会遇到问题。您将收到一个错误,指出有些元素无法反序列化。 通过将[BsonIgnoreExtraElements]属性添加到Person类,可以轻松修复此问题。您可以在下面看到修改后的类。这将指示驱动程序忽略它无法反序列化为相应属性的任何元素。使用该属性,可以将Persons集合中的任何文档解密到Person类而不会出错。

[BsonIgnoreExtraElements]
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class PersonWithBirthDate : Person
{
    public DateTime DateOfBirth { get; set; }
}

我希望这会清除你的理解。