Mongo DB C#驱动程序在映射复杂类时引发异常

Mih*_*hai 1 c# serialization mongodb 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; }
}
Run Code Online (Sandbox Code Playgroud)

我只希望将类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");
});
Run Code Online (Sandbox Code Playgroud)

这引发了一个异常,从我设法发现的异常中似乎是因为这些属性不属于C类。我应该如何映射这种结构?

Rob*_*tam 5

类映射在继承层次结构中的工作方式是为层次结构中的每个类注册一个类映射,并且每个类映射仅定义该类中存在的属性。因此,您想像这样注册所有三个类:

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");
});
Run Code Online (Sandbox Code Playgroud)

您可以使用以下代码快速对其进行测试:

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

输出:

{ "fn" : "John", "ln" : "Doe", "age" : 33 }
Run Code Online (Sandbox Code Playgroud)

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