【问题标题】:Mongo db C# driver throws exception when mapping complex classesMongodb C#驱动程序在映射复杂类时抛出异常
【发布时间】:2012-03-12 15:49:13
【问题描述】:

我在使用 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 类。我应该如何映射这种结构?

【问题讨论】:

  • 能否包含异常消息和堆栈跟踪信息?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 2015-02-24
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      相关资源
      最近更新 更多