2016-11-19 33 views
1

У меня есть два объекта, родитель и ребенок. Я сохранил объект Parent parent1. Я хотел бы создать новый дочерний объект, установить его родительский атрибут в «parent1» и добавить его в коллекцию Childs на parent1.NHibernate не сохраняются детские объекты

Родитель

public class Parent: IEquatable<Parent> 
{ 
    public virtual IList<Child> Childs{ get; set; } 
    ... 
} 

Детский

public class Child: IEquatable<Child> 
{ 
    public virtual Parent Parent { get; set; } 
    ... 
} 

Parent.hbm.xml

<bag name="Childs" lazy="false" inverse="true" cascade="all"> 
    <key column="Id" /> 
    <one-to-many class="Child" /> 
</bag> 

Child.hbm.xml

<many-to-one name="Parent"> 
    <column name="Parent" sql-type="int" not-null="true" /> 
</many-to-one> 

работает этот код

var child = new Child(); 
child.Condition = value; 
Parent parent= m_parentmanager.Get(2); // "parent1" 
parent.Childs.Add(child); 
child.Parent = parent; 
m_childsmanager.Save(child); 

Когда я снова называть "Родитель родитель = m_parentmanager.Get (2)" несколько строк ниже, я могу видеть в режиме отладки эта коллекция Childs пуста. У меня есть кнопка, чтобы добавить Child to Parent (к коллекции Childs) в моем представлении. Когда я нажимаю кнопку в первый раз, этот код запускается, но коллекция Childs пуста. Когда я нажимаю кнопку второй раз, дочерний объект добавляется в коллекции Childs. Все остальные нажатия кнопок также не добавляют никакого нового дочернего объекта в коллекцию.

Может ли кто-нибудь сказать мне, что я делаю неправильно?

ответ

1

В БД отношение родителя к дочерним и дочерним по отношению к родительскому - определяется одним (тем же) столбцом. Это внешний ключ в детском столе. И это должно использоваться с обеих сторон при картировании

// column must be the one, which is used for many-to-one 
<bag name="Childs" lazy="false" inverse="true" cascade="all"> 
    <!--<key column="Id" />--> 
    <key column="Parent" /> 
    <one-to-many class="Child" /> 
</bag> 

// column Parent represents the relation, it must be used for Childs coll as well 
<many-to-one name="Parent"> 
    <column name="Parent" sql-type="int" not-null="true" /> 
</many-to-one> 

Кроме того, коллекции должны быть загружены лениво. Нет никакой выгоды, чтобы отображать их как нетерпеливые. Скорее загружайте его в запросе, чем принудительное сопоставление.

Остальное отображение похоже в порядке - обратное, и обе стороны назначаются в C# ... он должен работать

+0

Это работает! Большое спасибо !!! :) –

+0

Не могли бы вы помочь мне с другой проблемой с картографированием? Вы выглядите так, как будто знаете, что вы делаете ... [link] (http://stackoverflow.com/questions/40708309/nhibernate-mapping-class-with-attribute-of-same-type) –