2016-12-20 4 views
0

Я следующую структуруMongoDB класс отображение

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: Аргумент memberInfo должен быть для класса FixtureNode, но для класса FixtureNodeBase. "

LINQPad файл с примером можно скачать здесь example.linq

Если у вас есть какие-либо идеи, как решить эту проблему, пожалуйста, поделитесь вашей идеи.

ответ

0

Кажется, я нашел ошибку:

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 членов от базового класса должны быть удалены из унаследовали отображение класса.

Смежные вопросы