2010-02-18 125 views
6

我們有一個多對多的集合映射爲一個懶加載包的實體。當我們加載實體時,集合沒有加載 - 非常好。現在我們要爲該集合添加一個新的實體。只要我們這樣做,收集就會加載。NHibernate:添加一個實體到一個懶加載的多對多關係

如何在不加載整個集合(集合很大)的情況下添加新實體?

回答

0

此行爲的原因是當您向其添加()一個新項目時引用您的集合。該引用觸發延遲加載。

我發現最好避免在NHibernate中顯式的多對多映射。我通常使用兩個一對多關聯到第三個實體,其工作方式類似於鏈接表。確保將關係的許多方面設置爲inverse =「true」。然後,您可以直接執行:

session.Save(new LinkEntity(leftSideInstanceOrProxy, rightSideInstanceOrProxy);

另一個好處是,通常有大約要保存的關係,這也可以去新實體的信息。

+1

當沒有額外的信息需要時,這種方法使得你的域模型持久化依賴於 – Paco

+0

是的,我不想在這個模型中添加一個與業務無關的類。但是,我做了一個秒殺,而且我無法用其他方式做。我在想NHibernate不支持這個嗎?如果是這樣,有誰知道爲什麼不呢? – JontyMC

+0

二級緩存如何? – dariol

1

我有同樣的問題。

您只需創建中間實體並執行兩個一對多關係。

如果您檢查了它生成的用於更新多對多關係的語句,則無論如何您都不會使用它。 當您將一個新項目添加到多對多關係中時,首先加載的關係(我認爲這會生成一個select語句),然後更新該關係並進行提交。這種事情發生:

刪除針對每一個對象在陣列中進行(也許這是一個delete語句或N DELETE語句,我不記得了)

所有對象都重新插入到數據庫(N insert語句+新的那一個)。

如果您對多對多關係進行了大量更新,那麼多對多映射不適合您。您可以在不更改或不經常更改的對象上使用多對多(因爲所有刪除和重新插入)。

您應該製作3個對象(比如說User,Post,Vote - 這是一個USER_POST中間表)。 爲所有這些表創建主鍵(即使對於USER_POST)。創建一個代理鍵,併爲USER_ID,POST_ID設置爲USER_POST表的唯一約束。將它映射爲普通的一對多,多對一(親子,親子)關係,就是這樣。

1

如果您不想更改域模型,則可以直接執行SQL以更新m-m鏈接表(使用Nhibernate查詢或執行參數化存儲過程)。

此外,請注意,您將無法使用Add()操作(否則NH會自動觸發延遲加載)。相反,請考慮在您的存儲庫類上調用一個適當命名的方法。

相關問題