NHibernate:尝试保存相同对象类型的子集合失败

时间:2014-02-18 14:35:32

标签: c# nhibernate

我有一个本身就有一对多关系的类,当我试图保存一个孩子的集合时,只保存了第一个孩子,这是我的映射:

 <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,它只保存一个孩子

1 个答案:

答案 0 :(得分:1)

问题与以下事实有关:NHiberante <set>(与<bag>相比)代表了一系列独特记录。怎么解决?有两种不同的方式:

  1. 将映射从<set>更改为<bag>
  2. bool Equals(object obj) 类中实施int GetHashCode()AMU
  3. 第一个解决方案实际上是这样说:集合可以多次包含一个 相同的 项目。

    第二个解决方案是关于处理 相同 这个词。如何检查对象是否相同?从调用<set>方法GetHashCode()Equals()的角度来看。

    在这种情况下,我们需要区分子对象(由于分层性质,父母也是如此)。它应该

    • 不是基于代理密钥(ID),而是
    • e.g。在代码名称 ...或组合等属性上。或者在上面的User.ID
    • 示例中

    注意:顺便说一下,即使我们将<set>更改为<bag>,我们的映射实体也应该覆盖这些方法。这只是一个很好的做法。