映射复杂类时,Mongodb C#驱动程序抛出异常

时间:2012-03-12 15:49:13

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

我在使用BsonClassMap映射某些类时遇到问题。 我有3个这样的课程:

abstract class A {
  public string FirstName { get; set; }
}

abstract class B : A{
  public string LastName { get; set; }
}

class C : B {
  public int Age { get; set; }
}

我只希望将C类中可见的属性映射到数据库。

BsonClassMap.RegisterClassMap<C>(map =>
{
  map.MapProperty(c => c.FirstName).SetElementName("fn");
  map.MapProperty(c => c.LastName).SetElementName("ln");
  map.MapProperty(c => c.Age).SetElementName("age");
});

这引发了异常,并且从我设法发现它似乎是因为属性不属于C类。我应该如何绘制这种结构?

2 个答案:

答案 0 :(得分:4)

类映射在继承层次结构中的工作方式是为层次结构中的每个类注册一个类映射,每个类映射仅定义该类中存在的属性。所以你想要注册这三个类:

BsonClassMap.RegisterClassMap<A>(map =>
{
    map.MapProperty(a => a.FirstName).SetElementName("fn");
});
BsonClassMap.RegisterClassMap<B>(map =>
{
    map.MapProperty(b => b.LastName).SetElementName("ln");
});
BsonClassMap.RegisterClassMap<C>(map =>
{
    map.MapProperty(c => c.Age).SetElementName("age");
});

您可以使用以下代码快速测试:

var document = new C { FirstName = "John", LastName = "Doe", Age = 33 };
Console.WriteLine(document.ToJson());

输出:

{ "fn" : "John", "ln" : "Doe", "age" : 33 }

或者您可以使用属性来注释类,这通常要容易得多,但需要在数据模型类中创建对C#驱动程序的依赖。

答案 1 :(得分:0)

您可以将BsonIgnore属性添加到您不希望存储在数据库中的A类属性中。只需在属性上方添加[BsonIgnore],它就会被忽略。

还有一个BsonIgnoreIfNull属性正如它所说的那样 - 如果值为null,则忽略该元素。在您不想在数据库中为空值并浪费磁盘\内存的情况下非常有用。

此外,您可以使用BsonElement属性更改名称:

abstract class B : A{
  [BsonElement("ln")]
  public string LastName { get; set; }
}
class C : B {
  [BsonElement("age")]
  public int Age { get; set; }
}