0

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

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

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

提前致谢 :)

4

2 回答 2

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();
}
于 2012-04-06T13:04:55.070 回答
1

您无法恢复 ISession。从文档

如果 ISession 抛出异常,您应该立即回滚事务,调用 ISession.Close() 并丢弃 ISession 实例。ISession 的某些方法不会使会话保持一致状态。

创建 ISession 也很便宜,因此没有理由尝试重用它。如果您有 MVC 应用程序,您可能希望每个请求都有 ISession。

于 2012-04-06T13:36:35.247 回答