2012-08-27 32 views
1

我是nhibernate的新手。這是我想要做的。如何在nhibernate中更新

我從數據庫中獲取分配給他們的人員和計劃標識表。此表中的記錄由人物對象表示。讓我們把人的收集稱爲人。在用戶界面中,我可以將人員添加到該集合中,刪除人員並更改與該人員關聯的時間表ID。我在UI中進行所有這些更改並將人員對象(人員集合)發送到服務層。

服務層:

如果我這樣做

people.ForEach(x => INHibernateLinqRepository<person>.Save(x)); 

它插入在人收藏表中的每一個人。如果該數據庫已經存在於數據庫中,是不是應該更新?

這是別的東西我試圖 服務從UI讓人們後,我得到了人們的數據庫爲另一個集合。然後我比較兩者來決定哪些更新以及哪些要保存。然後我只保存新的項目。但然後它會拋出錯誤

a different object with the same identifier value was already associated with the session: 

我很沮喪。有人能幫我嗎?

回答

3

NHibernate的維護自己的會話(有時被稱爲「第一級緩存」)對象的列表。無論何時從數據庫加載某個對象,NHibernate會話都會將其存儲在內部字典中,這是一個identity map實現。

對象標識是字典鍵。如果你嘗試再次加載同一個實體,使用相同的會話,NHibernate將不會進入數據庫:它將從會話中返回對象。

當你從數據庫中加載的項目做一個比較,NHibernate的將它們存儲在會話中。之後,您正在嘗試保存已發送到服務層的同一對象(同一個ID)的另一個實例。 NHibernate,或者說,內部身份映射不會允許你這樣做,因爲緩存中已經有一個具有相同ID的項目。

您不需要從數據庫加載項目並手動進行比較。 NHibernate很聰明,可以自己做到這一點。你只需要撥打session.SaveOrUpdate(object)。如果對象標識未分配,它將執行插入。如果有一個id值,它會更新。