2012-11-02 71 views
0

我有一個Windows服務和ASP.NET MVC 2應用程序,它們都使用Fluent nHibernate(nHibernate 3)連接到同一個數據庫。NHibernate併發Windows服務ASP.NET MVC網站

其中一個實體(稱爲Profile)具有包含圖像的url的字符串屬性。

此屬性隨機丟失它的值,我無法弄清楚是什麼導致它。用戶通過MVC前端進行更新,但我的直覺是Windows服務正在用實體的舊實例覆蓋其值(Windows服務更新同一類中的另一個屬性)。

有人可以請解釋/幫助如何調試這個或最好的方式來管理併發,我已經讀過這個主題,但我對nHibernate的樂觀和悲觀鎖定感到困惑。

親切的問候

山姆

回答

0

的選項可以使用<version/>樂觀鎖。有了這個,你沒有性能缺陷,並且你確定結果就是你想要的。如果一個代理嘗試更新之前更新的另一個代理的記錄,則該代理將失敗。當然,你應該以某種方式處理這個異常,但至少你沒有髒更新/讀取。 要使用<version/> tou應該在表中添加一列以維護版本。在標準NH映射文檔:

<version 
     column="version_column"        
     name="PropertyName"         
     type="typename"          
     access="field|property|nosetter|ClassName"   
     unsaved-value="null|negative|undefined|value"  
     generated="never|always"       
/> 
+0

所以當Windows服務做的更新和StaleObjectException異常被拋出,我可以做另一次讀管理這種(以獲取最新版本並重新應用更改?)如果那麼我怎麼能在一個通用的Repository中做到這一點?我是否會使用反射來更新每個不同的值? –

+0

@SamLad不要使用反射,使存儲庫能夠處理這種情況 –

+0

感謝Felice,因此,如果我使用下面的通用存儲庫管理併發性的存儲庫,因爲每個方法都知道哪些屬性已更改。比我希望的工作更大,但這是有道理的。 –