NHibernate不会持久化子对象

时间:2016-11-19 19:12:36

标签: c# asp.net asp.net-mvc nhibernate nhibernate-mapping

我有两个对象,父母和孩子。我有持久对象父parent1。我想创建一个新的Child对象,将其Parent属性设置为“parent1”并将其添加到parent1上的Childs集合。

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);

当我再次调用“Parent parent = m_parentmanager.Get(2)”下面几行时,我可以在调试模式中看到集合Childs为空。我有一个按钮,可以在我的视图上将Child添加到Parent(到集合Childs)。当我第一次按下按钮时,此代码运行但Childs集合为空。当我第二次按下按钮时,Child实体被添加到Childs集合中。所有其他按钮单击也不会将任何新的Child实体添加到集合中。

有谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:1)

在DB中,父项与子项和子项与父项的关系由一个(相同)列定义。它是子表中的外键。并且必须在映射

中双方使用
// 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#中分配......它应该可以工作