2010-05-05 41 views
0

我有一個實體TrackLog,其組件集合爲TrackPoints。我創建一個新的TrackLog並添加一些Trackpoints並將其保存到數據庫。保存一個組件集合的實體應該做一個SQL DELETE,然後使用NHibernate INSERT?

當我搶我TrackLog再次添加新TrackPoint,而不是做一個SQL INSERT像我期望的那樣,它做在與TrackLog相關聯的所有TrackPoints一個刪除,然後重新添加每TrackPoint那就是收藏。

這是NHProf輸出:

UPDATE TrackLog SET Version = 2 etc... 
DELETE FROM TrackPoints WHERE TrackLog_Id = '80cc1e0d' etc... 
INSERT INTO TrackPoints etc.. 
INSERT INTO TrackPoints etc... 
INSERT INTO TrackPoints etc... 

我的問題是,是一個組件集合這種正常行爲?這也發生在我的枚舉集合中。如果這不是正常行爲,我該如何修改映射以使其顯示正確的行爲(我添加的TrackPoint只有一個INSERT)?

回答

1

這是正常的。

爲了避免它,聲明你的收藏作爲set而不是bag(和使用兼容的類型),如果你的使用情況支持它(即有不能有兩個航跡點使用相同的數據)

+0

謝謝,我我自己也得出了同樣的結論。還有一點需要注意,你的組件必須重寫'Equals()'和'GetHashCode()',否則性能會更差(而不是一個DELETE語句,它會爲每個項目生成一個DELETE,然後執行INSERT每一個)。 – 2010-05-05 19:28:52

+0

是的,這是正確的,它是有道理的,因爲組件沒有標識符,所以這是唯一的方法(NH)告訴它們分開。 – 2010-05-05 19:46:24

相關問題