2

我有子類的兩個列表父類NHibernate的有許多插入產生額外的更新(無反)

public class Parent 
    { 
     ... 

     public virtual ICollection<Foo> Foo{ get; set; } 

     public virtual ICollection<Bae> Bar{ get; set; } 
    } 

    public class Foo 
    { 
     ... 

     public virtual Parent Parent{ get; set; } 
    } 

    public class Bar 
    { 
     ... 

     public virtual Parent Parent{ get; set; } 
    } 

的映射是

 public ParentMap() 
     { 
      ... 

      HasMany(m => m.Foo).AsSet().Cascade.All(); 
      HasMany(m => m.Bar).AsSet().Cascade.All(); 
     } 

     public FooMap() 
     { 
      ... 

      References(m => m.Parent); 
     } 

     public BarMap() 
     { 
      ... 

      References(m => m.Parent); 
     } 

每當我保存父對象,我得到

INSERT Parent ... 
INSERT Foo with Parent_id set to NULL 
INSERT Bar with Parent_id set to NULL 
UPDATE Foo set Parent_id to Parent id 
UPDATE Bar set Parent_id to Parent id 

是否有自定的方式除了Inverse的關係,以避免額外的更新?

回答

9

如果你有一個雙向協會,你應該應該設置HasMany方面反轉,這是最常見的方式。

另一種可能性是將父引用設置爲Not.Insert().Not.Update(),那麼對於插入/更新,父屬性將被完全忽略。

如果您不需要孩子到父母的引用,只需從類和映射中將其刪除,以便您只擁有該集合。

對於第二種和第三種方法,您可以在HasMany上額外設置Not.KeyNullable(),這樣可以確保NHibernate插入已經設置了父ID的新行並避免額外的更新語句(該功能需要NHibernate 3.2.0)。

+0

它是沒有意義的拯救孩子,以拯救父母。特別是當有兩個不同的兒童對象時。我想要的是調用'session.Save(parent)'和整棵樹來保存。 –

+0

@Circadian,這正是你的反作用。您不必有一個孩子來保存父母。 –

+0

@Circadian你已經有'Cascade.All()',這將確保你不需要在子節點上調用'Save()'。這是反向或我建議的任何其他方法的獨立。 – cremor

1

AFAIK,不是。 通過設置反轉屬性,可以指定關聯的所有者。

爲什麼指定反轉屬性是一個問題?

+0

該協會的所有者是父母。讓我的一個孩子控制它似乎是不合理的。 –

+0

通過指定inverse屬性,可以說父母是所有者。 –

+0

如果我在'HasMany'上指定了反向,我將其所有權交給了其中一個子項。或者我認爲。在'References'上我不能指定inverse。 –