2009-08-24 49 views
6

我有一個自引用類。一個孩子有一個對其父母的引用,而一個父母有一個孩子的列表。由於孩子的名單是有序的,我試圖用NHibernate的關係映射關係。Nhibernate - 映射列表不更新列表索引

這是我的映射:

<class name="MyClass"> 
    <id name="Id"> 
    <generator class="native"/> 
    </id> 
    <list name="Children" cascade="delete" inverse="true"> 
    <key column="ParentId"/> 
    <index column="ListOrder"/> 
    <one-to-many class="MyClass"/> 
    </list> 
    <many-to-one name="Parent" class="MyClass" column="ParentId"/> 
</class> 

我有有一個雙向映射孩子時<問題 - >父,列表指數(ListOrder)沒有更新數據庫的時候我做我的CRUD舞蹈。這意味着當我例如刪除孩子,保存到數據庫並再次獲取父母后,我在孩子列表中找到了漏洞。如果我刪除雙向性,由於沒有從子級到父級的多對一(並且沒有inverse = true),ListOrder會正確更新。

有沒有人見過這個?有沒有簡單的解決方案?

+0

它,因爲逆=真正的,不知道最好的解決辦法是什麼呢,此刻正好具有同樣的問題。敬請關注 – 2009-10-19 14:53:44

+0

是的,這是因爲inverse = true。如果這個bidir被刪除了,那麼所有事情都按我希望的那樣工作,ListOrder-wise。事情是我必須自己實施孩子的財產,我不想這樣做。 – 2009-10-26 15:38:43

回答

5

是的,這是因爲inverse = true,另一種解決方案是使用set或bag而不是list = orderOrder,將ListOrder列作爲屬性添加到MyClass類中,一個總是從父母的子集合中返回索引的getter。就像這樣:

<class name="MyClass"> 
    <id name="Id"> 
     <generator class="native"/> 
    </id> 
    <bag name="Children" cascade="delete" inverse="true" order-by="ListOrder"> 
     <key column="ParentId"/> 
     <one-to-many class="MyClass"/> 
    </bag> 
    <property name="ListOrder" column="ListOrder"/> 
    <many-to-one name="Parent" class="MyClass" column="ParentId"/> 
</class> 

和類

public class MyClass 
{ 
    public virtual int ID { get; set; } 
    public virtual IList<MyClass> Children { get; set; } 
    public virtual MyClass Parent { get; set; } 

    public virtual int ListOrder 
    { 
     get 
     { 
      if (Parent == null || !Parent.Children.Contains(this)) return -1; 
      return Parent.Children.IndexOf(this); 
     } 
     set { } 
    } 
} 
+3

感謝您的建議。 今天在我的代碼中,我添加/刪除孩子正確設置ListOrder時使用掛鉤。我基本上圍繞NHibernate的工作不像我期望的那樣在我的域中添加邏輯。 您的建議是另一個域的解決方法。這可能比我的要好,但仍然是一種解決方法。如果我的列表的語義是一個列表,我想將它映射爲一個列表,而不是一個排序的包。 – 2009-11-19 13:34:58

+0

我喜歡財產的想法 – 2014-10-02 17:55:48