NHibernate множественные родители с одним и тем же дочерним объектом Ссылка на родителя - PullRequest
2 голосов
/ 26 сентября 2011

У меня есть структура данных с двумя родителями, у которой могут быть дети одного и того же класса (сущности).

public class Parent1 : BaseParent
{
    public Parent1()
    {
        Childs1 = new List<Child>();
    }
    public virtual IList<Child> Child1 { get; set; }
}

public class Parent2 : BaseParent
{
    public Parent2()
    {
        Childs2 = new List<Child>();
    }
    public virtual IList<Child> Child2 { get; set; }
}

public class Child
{
    public virtual BaseParent Parent { get; set; }
}

Ребенок должен иметь ссылку на своего родителя, коллекции которого он принадлежит. Это означает, что если Child находится в коллекции Parent1.Childs1, Child.Parent должен ссылаться на Parent1. Если Child находится в коллекции Parent2.Childs2, Child.Parent должен ссылаться на Parent2.

Я пытался с

public class Parent1Map: ClassMap<Parent1>
{
    public Parent1Map()
    {
        Table("PARENT1");
        :
        HasMany<Child>(x => x.Child1).KeyColumn("PARENT1REF");
    }
}

public class Parent2Map: ClassMap<Parent2>
{
    public Parent2Map()
    {
        Table("PARENT2");
        :
        HasMany<Child>(x => x.Child1).KeyColumn("PARENT2REF");
    }
}

public class ChildMap: ClassMap<Child>
{
    public ChildMap()
    {
        Table("CHILD");
        :
        References<Parent1>(c => c.Parent).Column("PARENT1REF");
        References<Parent2>(c => c.Parent).Column("PARENT2REF");
    }
}

Но это не работает. Я получаю сообщение об ошибке Попытка добавить «родитель» «многие к одному», когда уже добавлено .

Как я могу сделать отображение, чтобы родительские ссылки дочерних элементов были правильно загружены из базы данных?

1 Ответ

2 голосов
/ 27 сентября 2011

У меня была похожая проблема, и я пошел со ссылкой. Это применимо, только если ребенок никогда не находится в более чем одной коллекции.

// ChildMap
ReferencesAny(result => result.Parent)
    .EntityTypeColumn("discriminator")
    .EntityIdentifierColumn("Parent_id")
    .IdentityType<long>()
    .AddMetaValue<Parent1>("parent1")
    .AddMetaValue<Parent2>("parent2");


// parent1map
HasMany(part => part.Childs)
    .Where("discriminator = 'parent1'");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...