2009-12-15 128 views
0

我試圖從映射爲.HasMany()列表中添加和刪除元素,但NHibernate的執行一些奇怪的疑問在這個簡單的場景:流利NHibernate的一個一對多的插入/刪除問題

if (Profile.Artists.Any(x => x.Artist == artist)) 
{ 
    Profile.Artists.Remove(Profile.Artists.Single(x => x.Artist == artist)); 
} 
else 
{ 
    Profile.Artists.Add(new Artist { Artist = artist, User = User.Current.ID }); 
} 

這個方法是通過一個事務來執行的。我得到的是一個系列爲整個集合SELECT語句:

SELECT ... WHERE artis0_.User=?p0;?p0 = 5 

等等,然後NHibernate的嘗試更新檔案第一和第二的藝術家。雖然藝術家只能被刪除或插入(注意:反向()藝術家只能被插入並且不會被刪除)。

UPDATE user_profile SET UserFK = ?p0 ... 

UPDATE user_artists SET User = null WHERE User = ?p0 AND User = ?p1 AND Artist = ?p2;?p0 = 5, ?p1 = 5, ?p2 = 16 

映射像這樣做:

mapping.HasMany<Artist>(x => x.Artists) 
       .KeyColumn("User") 
       .Inverse() 
       .Cascade.All(); 

這些都沒有使任何意義對我來說,尤其是該系列的SELECT語句的。我在這裏做錯了什麼?

回答

0

很明顯,Profile對象存儲在Web Session中,而nHibernate Session存儲在Items中,因此Profile自然分離並被更新,這也更新了它的子項,從而觸發了集合的全部重新加載。

解決方案是簡單地重新加載每個請求上的配置文件。

2

如果你想NHibernate的刪除孤兒使用級聯模式全刪除,孤兒

mapping.HasMany<Artist>(x => x.Artists) 
      .KeyColumn("User") 
      .Inverse() 
      .Cascade.AllDeleteOrphans(); 
+0

謝謝,但它並沒有解決與SELECT的問題。 – 2009-12-15 12:00:53

0

你的選擇正在因爲你的Any調用,而迭代一個延遲加載集合裝載每個項目作爲解僱它走了。

如果您確實需要迭代該集合,那麼您要麼將其與惰性加載並擁有這些選擇一起使用,要麼您希望加載它。