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 ) );
} );
即Name
和 Children
基 class 成员的映射应从继承的 class 映射中删除。
我有以下数据结构
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 ) );
} );
即Name
和 Children
基 class 成员的映射应从继承的 class 映射中删除。