2014-02-18 30 views
1

我也有其自身內一個一對多的關係一類,試圖挽救孩子的集合時,僅第一個孩子是被保存,這裏是我的映射: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循環數AMUs添加到父AMU

foreach(var amu in AMUList) 
{ 
    myAMU.ManagedAMUs.Add(amu); 
} 

,然後保存父AMU,它不僅節省了一個孩子

回答

1

的問題是相關的事實,即NHiberante <set>(與<bag>比較)是代表的獨特記錄的集合。如何解決它?有兩個非常不同的方式:

  1. 變化從<set>映射到<bag>
  2. 實現在AMU

第一溶液中bool Equals(object obj)int GetHashCode(),其實是在說:收集可能包含一個相同項目很多次。

第二種解決方案是關於處理word 相同。如何檢查對象是否相同?從<set>的角度來看,方法GetHashCode()Equals()被調用。

在這種情況下,我們需要區分子對象(因等級性質,父母以及)。它應該

  • 不基於所述surrogated鍵(ID),但
  • 例如性質如代碼名稱 ...或組合。還是在上User.ID

注意上面的例子:順便說一下,即使我們改變<set>是一個<bag>,我們映射實體應覆蓋這些方法。這只是一個很好的做法。

相關問題