2013-03-15 50 views
1

我使用NHibernate來訪問數據層。 我有一個實體在內存中以前加載,並進行更改以便在數據庫後保存。問題出在我的應用程序同時在某些機器上運行時,而其他用戶已從數據庫中刪除了我在內存中保存的同一對象並且我想保存。當我嘗試保存更改或刪除此實體時,會觸發StaleStateException。StaleStateException當保存被其他會話刪除的實體(併發)

我檢查,如果數據庫調用的這種方式session.Get<T>存在的實體(it's得到一個空成功地):

using (var session = NHibernateSessionHelper.OpenSession()) 
{ 
    using (var transaction = session.BeginTransaction()) 
    { 
     var entity = session.Get<T>(persistObject.Id); 
     return entity == null ? false : true; 
    } 
} 

問題是當我不能當實體已被刪除區分由其他會話/用戶(因此我的實體在內存中已過時)或實體最近已創建並能夠保存。 我認爲唯一的解決方案是實現一種機制來檢查實體是否已經從數據庫中保存或加載,以便丟棄實體或在繼續時保存。

有沒有辦法通過使用nhibernate檢查此行爲?我試着用session.Refresh() and session.Get<T>,但我仍然不知道對象是否是新的,並準備保存或過時。

非常感謝。

回答

1

您所處的位置是處理錯誤的一個錯誤。由於用戶已決定刪除數據庫中的對象,並且其他用戶希望將更改保存到同一對象,所以您無法說出正確的狀態應該是什麼。用戶是應該自殺的人如何處理情況。通過給他一些選擇,你可以讓你的錯誤處理更加智能。對於有多個用戶寫入同一個對象的情況,您還應該實施樂觀鎖定等機制,以防止其他用戶覆蓋他沒有看到的更改。如果你有很多這樣的情況,你應該考慮重新設計你的數據庫/對象結構來一次編輯更少的數據,或者重新考慮你的用戶在系統中做的工作/處理。

+0

是的,我同意你的意見(是我的初步意見),但我不知道NHibernate中是否有任何機制來獲取實體是否過時。我有一個解決方法,在實體中創建一個布爾屬性,指明是否已由用戶創建(創建新元素)或由Nhibernate填充。 – Carlos 2013-03-15 12:37:37

相關問題