NHibernate ISession:异常后没有任何东西可以保留

时间:2012-04-05 17:47:08

标签: asp.net-mvc nhibernate isession

我对NHibernate ISession有疑问。当我尝试在数据库中存在错误时(例如在XYZ col上保存具有重复键的实体)并回滚Transaction; ISession实例进入BROKEN / INVALID状态,该状态在此之后不会保留任何记录,并且每次NHibernat都会抛出另一个异常,告诉我第一次出现问题。

我使用了Flush, Clear, Close之类的ISession方法,但我的问题存在。另一种方法是从ISession请求另一个ISessionFactory实例,但是当我使用它时,另一个奇怪的问题是:illegal attempt to associate a collection with two open sessions

如何在不重新请求ISessionFactory的情况下恢复ISession实例?

提前致谢:)

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

您无法恢复ISession。来自documentation

  

如果ISession抛出异常,则应立即回滚   在事务中,调用ISession.Close()并丢弃ISession   实例。某些ISession方法不会将会话留在   一致的状态。

同样creating ISession is cheap所以没有理由尝试重复使用它。如果你有MVC应用程序,你可能希望每个请求都有ISession。