MongoDB class 映射

MongoDB class mapping

我有以下数据结构

internal class FixtureNodeBase
{
  public FixtureNodeBase( string name, IEnumerable<FixtureNodeBase> children )
  {
    Name = name;
    Children = children.ToList().AsReadOnly();
  }

  public string Name { get; }

  public IReadOnlyList<FixtureNodeBase> Children { get; }
}

internal class FixtureNode : FixtureNodeBase
{
  public FixtureNode(
    string name,
    string assembly,
    string runnableName,
    IEnumerable<FixtureNodeBase> children )
    : base( name, children )
  {
    Assembly = assembly;
    RunnableName = runnableName;
  }

  public string Assembly { get; }

  public string RunnableName { get; }
}

internal class FixtureTree
{
  public FixtureTree( FixtureNodeBase root )
  {
    Root = root;
  }

  public FixtureNodeBase Root { get; }
}

internal class Build
{
  public Build( FixtureTree fixtures )
  {
    Fixtures = fixtures;
  }

  public FixtureTree Fixtures { get; }
}

对于我使用以下映射的数据结构

BsonClassMap.RegisterClassMap<Build>(
  cm =>
  {
    cm.MapMember( x => x.Fixtures );
    cm.MapCreator( x => new Build( x.Fixtures ) );
} );

BsonClassMap.RegisterClassMap<FixtureTree>(
  cm =>
  {
    cm.MapMember( x => x.Root );
    cm.MapCreator( x => new FixtureTree( x.Root ) );
} );

BsonClassMap.RegisterClassMap<FixtureNodeBase>(
  cm =>
  {
    cm.MapMember( x => x.Name );
    cm.MapMember( x => x.Children );
    cm.MapCreator( x => new FixtureNodeBase( x.Name, x.Children ) );
} );

BsonClassMap.RegisterClassMap<FixtureNode>(
  cm =>
  {
    cm.MapMember( x => x.Name );
    cm.MapMember( x => x.Assembly );
    cm.MapMember( x => x.RunnableName );
    cm.MapMember( x => x.Children );
    cm.MapCreator( x => new FixtureNode( x.Name, x.Assembly, x.RunnableName, x.Children ) );
} );

它抛出 FixtureNode 映射的异常:

"System.ArgumentOutOfRangeException : The memberInfo argument must be for class FixtureNode, but was for class FixtureNodeBase."

可以从这里下载带有示例的 LINQPad 文件example.linq

如果您有任何想法,如何解决问题,请分享您的想法。

看来,我找到我的错了:

BsonClassMap.RegisterClassMap<FixtureNode>(
  cm =>
  {
    cm.MapMember( x => x.Name );
    cm.MapMember( x => x.Assembly );
    cm.MapMember( x => x.RunnableName );
    cm.MapMember( x => x.Children );
    cm.MapCreator( x => new FixtureNode( x.Name, x.Assembly, x.RunnableName, x.Children ) );
} );

必须更新为

BsonClassMap.RegisterClassMap<FixtureNode>(
  cm =>
  {
    cm.MapMember( x => x.Assembly );
    cm.MapMember( x => x.RunnableName );
    cm.MapCreator( x => new FixtureNode( x.Name, x.Assembly, x.RunnableName, x.Children ) );
} );

NameChildren 基 class 成员的映射应从继承的 class 映射中删除。