Mongo-dbC#驱动程序在映射复杂类时抛出异常

本文关键字:抛出异常 复杂 映射 驱动程序 Mongo-dbC# | 更新日期: 2023-09-27 18:27:26

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

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类。我应该如何绘制这种结构?

Mongo-dbC#驱动程序在映射复杂类时抛出异常

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

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#驱动程序的依赖关系。

您可以将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; }
}