2012-12-28 80 views
4

我有一個類似於這樣的場景: Asp.NET MVC 4網站使用nHibernate Session Per Request。 使用Ninject將會話注入到使用Get和Save方法的存儲庫中。每個請求和異常管理nHibernate會話

有很多文章談論Session Per Request,並說這是在Web應用程序上做事情的方式。

實現邏輯像這樣的,但我有問題:

Read Data From Database 
Alter Entity information 
Save to Database 
Read another entity 
Alter entity 
Save ... but an EXCEPTION OCCURS 

我想表明我有一個消息到用戶視圖。但我也要刷新生成的網頁, ,所以我也從數據庫中讀取一些信息。

據NHibernate的文件,除會話必須被丟棄Documentation Here

但我不能找到在這裏,最好的方法的任何物品。

這種情況的最佳方法是什麼?我將不得不向我的資源庫對象注入一個新的會話?

謝謝。

回答

4

您可以從原始會話的SessionFactory屬性創建一個新會話。您可以通過將其暴露在存儲庫類中或將其注入到控制器中來訪問原始會話對象。然後,您可以使用新會話創建新的存儲庫。

我在我的某些操作中會這樣做,我希望發生唯一的密鑰違規,並且必須重新加載模型中的查找數據。這裏有一個例子:

public ActionResult Create(MeasuresEditView model) 
    { 
     if (ModelState.IsValid) 
     { 
      using (var txn = _session.BeginTransaction()) 
      { 
       try 
       { 
        var measure = new Measure { Code = model.Code }; 
        _session.Save(measure); 
        txn.Commit(); 
        return RedirectToAction("Index"); 
       } 
       catch (UniqueKeyException) 
       { 
        txn.Rollback(); 
        var msg = string.Format("A measure with the code '{0}' already exists, please enter a different code or cancel.", model.Code); 
        ModelState.AddModelError("Code", msg); 
       } 
       catch (Exception ex) 
       { 
        if (txn.IsActive) 
        { 
         txn.Rollback(); 
        } 
        log.Error("Create", ex); 
        throw; 
       } 
      } 
     } 
     // have to rebuild selectlist on post in new txn in case it was rolled back 
     using (var session = _session.SessionFactory.OpenSession()) 
     using (var txn = session.BeginTransaction()) 
     { 
      SetProductGroupSelectList(session, model, manualId); 
      txn.Commit(); 
     } 
     return View(model); 
    } 
+0

謝謝,我會用它作爲我的解決方案的基準。我將嘗試將它與Repository和工作單元模式集成。 –

相關問題