2012-04-05 20 views
0

後堅持我有一個問題與NHibernate ISession。當我嘗試將錯誤的數據保存到數據庫中(例如,在XYZ col上保存具有重複鍵的實體)並回滾Transaction; ISession例如去不堅持之後的任何記錄一個破碎/無效,每次NHibernat拋出另外一個異常,告訴我,第一次的問題。的NHibernate的ISession:沒有什麼能的異常

我用的Isession方法,如Flush, Clear, Close但我的問題存在。另一種方法是從ISessionFactory請求另一個ISession實例,但是當我使用這個時,另一個奇怪的問題是:illegal attempt to associate a collection with two open sessions

如何在沒有重新請求另一個從ISessionFactory恢復的ISession實例?

感謝提前:)

+0

你對這個模型有一個lazyload屬性嗎? – 2012-04-05 18:02:11

+0

是的!很多懶惰加載的屬性(導航,集合) – Sadegh 2012-04-05 18:05:21

+0

如果您要求某些屬性可能是一個問題。 – 2012-04-05 20:44:04

回答

1

您不能恢復的Isession。從documentation

如果ISession的拋出一個異常,你應該立即回滾 的交易,稱之爲ISession.Close()和丟棄的ISession 實例。 ISession的某些方法不會使會話保持一致的狀態。

creating ISession is cheap所以沒有理由嘗試重用它。如果您有MVC應用程序,您可能希望每個請求都有ISession。

1

你不能,你不應該。

如果交易失敗,則必須中止請求,並顯示錯誤。

的邏輯推論是會話異常不應該是你的正常流動的一部分。

現在,既然你使用MVC,這裏有一個,如果你允許錯誤錯誤處理是如何發揮作用的例子:

public ActionResult CreateFoo(FooModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     try 
     { 
      SaveThe(model); 
      TheTransaction.Commit(); 
      return RedirectToAction("Whatever"); 
     } 
     catch (WhateverTheDuplicateKeyExceptionIs) 
     { 
      ModelState.AddModelError("", "Duplicate XYZ"); 
     } 
    } 
    return View(); 
}