2009-12-03 71 views
4

我有一個用戶表和一個網絡表與他們之間的多對多關係(用戶可能會長到多個網絡和一個網絡可能包含許多用戶)。多對多關係保存在「UserNetworks」表中,該表僅包含兩列UserId和NetworkId。NHibernate多對多刪除所有關聯之前插入

我的課是這樣的:

public class User 
{ 
    public IList<Network> Networks {get; set;} 
} 

public class Network 
{ 
    public IList<Usre> Users {get; set;} 
} 

NHibernate的映射,這些許多一對多的集合是這樣的:

User.hbm.xml:

<bag name="Networks" table="UserNetworks" cascade="save-update" inverse="true"> 
    <key column="UserId" /> 
    <many-to-many class="Network" column="NetworkId" /> 
</bag> 

網絡.hbm.xml:

<bag name="Users" table="UserNetworks" cascade="save-update"> 
    <key column="NetworkId" /> 
    <many-to-many class="User" column="UserId" /> 
</bag> 

在我的代碼,我創建了一個用戶和網絡之間的關聯,像這樣:

user.Networks.Add(network); 
network.Users.Add(user); 

我期望的SQL運行簡單地執行一個INSERT到UserNetworks表。相反,它在NetworkNet = X上執行UserNetworks表上的DELETE,然後繼續將所有UserNetworks行與新關聯一起重新插入。

我在做什麼錯?

回答

5

該行爲是由設計。看到,NH不知道列表中當前/新/刪除了什麼。所以通過刪除所有內容並在列表中插入任何內容都是有意義的。

+2

下面是從手動(15.5.1節)的文本...」 袋子是最壞的情況下,由於bag允許重複的元素值,也沒有索引字段,沒有主密鑰 可以被定義。NHibernate的具有沒有辦法區分重複的行NHibernate通過徹底刪除(在一個DELETE中)並在集合發生改變時重新創建這個集合來解決這個問題可能效率很低。 – 2009-12-03 04:29:28

+0

完美。我在我的UserNetworks表中添加了一個標識列,並切換到IdBag,它工作得很好。謝謝! – 2009-12-03 04:37:26

+0

太棒了!這就是我爲我的項目所做的。 :) – 2009-12-03 04:47:57

相關問題