Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate:尝试保存相同对象类型的子对象集合失败_C#_Nhibernate - Fatal编程技术网

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

C# NHibernate:尝试保存相同对象类型的子对象集合失败,c#,nhibernate,C#,Nhibernate,我有一个类,它本身具有一对多关系,当试图保存一个子类集合时,只保存第一个子类,下面是我的映射: <class name="AMU" table="AMU"> <id name="ID" column="ID"> <generator class="identity"/> </id> <many-to-one name="_Manager" class="AMU" colu

我有一个类,它本身具有一对多关系,当试图保存一个子类集合时,只保存第一个子类,下面是我的映射:

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

然后保存父AMU,它只保存一个子AMU。这个问题与以下事实有关:NHiberante
(与
相比)代表一组独特的记录。如何修复它?有两种非常不同的方式:

  • 将映射从
    更改为
  • AMU
    类中实现
    bool Equals(object obj)
    int GetHashCode()
  • 事实上,第一种解决方案是:集合可以多次包含一个相同的

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

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

    • 不是基于代理密钥(ID),而是
    • e、 g.在代码或名称等属性上。。。或组合。或者在上面的示例中,在User.ID上
    注意:顺便说一下,即使我们将
    更改为
    ,我们的映射实体也应该覆盖这些方法。这只是一个好的做法

    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; }
    }
    
    foreach(var amu in AMUList)
    {
        myAMU.ManagedAMUs.Add(amu);
    }