Свободная проблема родительского идентификатора вставки NHibernate с отношением HasMany - PullRequest
0 голосов
/ 16 сентября 2011

Я не могу понять, почему NHibernate вставляет дочернюю сущность без внешнего ключа родителя. Единственный способ, который я нашел, чтобы решить эту проблему - это двунаправленные отношения, есть ли другой способ?

Вот классы:

public class Parent
{
    public virtual int ParentId {get; private set;}
    public virtual IList<Child> Notes {get; private set;}
}

public class Child
{
    public virtual ChildId {get; private set;}
    public virtual Name {get; private set;}
}

Вот мое свободное отображение NHibernate

public class ParentClassMap : ClassMap<Parent> 
{
    public ParentClassMap(){
        Id(x => x.ParentId);
        HasMany(x => x.Notes).Cascade.AllDeleteOrphan();
    }
}

public class ChildClassMap : ClassMap<Child> 
{
    public ChildClassMap() {
        Id(x => x.ChildId);
        Map(x => x.Name);
    }
}

Когда я добавляю дочерний элемент в дочернюю коллекцию родителя и сохраняю родительский элемент, родительский элемент и дочерний элемент вставляются в базу данных, но дочерний элемент вставляется без внешнего ключа для родительского элемента (он имеет нулевое значение)

Это сгенерированная вставка:

INSERT INTO Child(ChildId, Name)

Но это должно быть:

INSERT INTO Child(ChildId, Name, ParentId)

Я хочу добавить, что я не хочу разрешать это с помощью двунаправленных отношений, я не хочу, чтобы у ребенка была ссылка на родителя. Спасибо !!

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

Добавьте Not.KeyNullable() к вашему HasMany сопоставлению.

Примечание. Для этой функции требуется NHibernate 3.2.

0 голосов
/ 16 сентября 2011

Ваше родительское отображение класса должно иметь обратное значение для своего потомка

public class ParentClassMap : ClassMap<Parent> 
{
    public ParentClassMap(){
        Id(x => x.ParentId);
        HasMany(x => x.Notes).Cascade.AllDeleteOrphan().Inverse();
    }
}

Спасибо, Нилеш

...