我有一个本身就有一对多关系的类,当我试图保存一个孩子的集合时,只保存了第一个孩子,这是我的映射:
<class name="AMU" table="AMU">
<id name="ID" column="ID">
<generator class="identity"/>
</id>
<many-to-one name="_Manager" class="AMU" column="ParentID" access="field"/>
<many-to-one name="User" column="UserID"/>
<many-to-one name="MCT" column="MctID"/>
<set name="ManagedAMUs" fetch="select" cascade="all-delete-orphan" inverse="false">
<key column="ParentID"/>
<one-to-many class="AMU"/>
</set>
</class>
这是类定义:
public class AMU : TABS.Components.BaseEntity
{
public AMU()
{
this.User = null;
this.Manager = null;
this.ManagedAMUs = new List<AMU>();
}
public virtual int ID { get; set; }
public virtual User User { get; set; }
private AMU _Manager;
public virtual AMU Manager
{
get { return _Manager; }
set { _Manager = value; }
}
public virtual ICollection<AMU> ManagedAMUs { get; set; }
public virtual MCT MCT { get; set; }
}
当我使用for循环将几个AMU添加到父AMU
时foreach(var amu in AMUList) { myAMU.ManagedAMUs.Add(amu); }
然后保存父AMU,它只保存一个孩子
答案 0 :(得分:1)
问题与以下事实有关:NHiberante <set>
(与<bag>
相比)代表了一系列独特记录。怎么解决?有两种不同的方式:
<set>
更改为<bag>
bool Equals(object obj)
类中实施int GetHashCode()
和AMU
第一个解决方案实际上是这样说:集合可以多次包含一个 相同的 项目。
第二个解决方案是关于处理 相同 这个词。如何检查对象是否相同?从调用<set>
方法GetHashCode()
和Equals()
的角度来看。
在这种情况下,我们需要区分子对象(由于分层性质,父母也是如此)。它应该
注意:顺便说一下,即使我们将<set>
更改为<bag>
,我们的映射实体也应该覆盖这些方法。这只是一个很好的做法。