2011-10-19 41 views
1

根據http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-exceptions,數據庫異常後,會話應該被丟棄。在數據庫異常後重新啓動NHibernate會話,無CurrentContext

現在,在我們的Web應用程序中,在某些情況下,拋出並捕獲ADOExceptions是正常的。例如違反約束條件。

根據鏈接的文件我們應該放棄會話。然而,如果我們違反約束條件,我們仍然希望對數據庫做一些工作,所以我需要一個新的會話。

在我們的測試中,我們通過調用

CurrentSessionContext.Unbind(SessionFactory).Close(); 
CurrentSessionContext.Bind(SessionFactory.OpenSession()); 

,但我們不使用CurrentSessionContext Web應用程序做到這一點,我們使用LazySessionContext。所以我們不能直接引用業務類中的CurrentSessionContext,因爲它不是從web使用的,我們不能引用LazySessionContext,因爲在集成測試期間HttpContext不可用。

有沒有辦法處置和重新創建會話並將其連接到當前上下文,而不是直接引用上下文類?我有SessionFactory對象和Session對象。

+0

NHibernate參考資料的最新鏈接:http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-exceptions –

回答

0

不想聽起來至關重要我建議您需要重新考慮應用程序的設計。您應該通過使用實例的組合框或驗證來實現接口,以防止用戶輸入會導致違反約束條件等ADOException的數據。如果發生這些情況,那麼他們就會出現異常情況,您可以將其作爲內部錯誤報告給用戶,並可能通過單獨的機制(例如通過內置於ASP.NET中的運行狀況監視)記錄該錯誤。

我還想補充一點,你的實體可能需要另外一個外觀,因爲當你使用NHibernate時,你通常不需要擔心約束違規。

+0

在多用戶應用程序中並不那麼容易。如果用戶A嘗試在用戶B刪除EntityB後僅用一秒鐘就引用實體B來保存新的EntityA,該怎麼辦? – cremor

+0

@cremor根據您的用例實現鎖定優化或悲觀。 – s1mm0t

+0

樂觀鎖定失敗也是例外。並且只要任何用戶具有EntityA打開的編輯或創建用戶界面,鎖定可以從EntityA引用的所有表格是不切實際的。 – cremor

相關問題