Asp.net mvc NHibernate ISession:异常后无法持久化任何内容

Asp.net mvc NHibernate ISession:异常后无法持久化任何内容,asp.net-mvc,nhibernate,isession,Asp.net Mvc,Nhibernate,Isession,我对NHibernateISession有问题。当我试图将错误的内容持久保存到数据库中(例如,在XYZ列上保存具有重复键的实体)并回滚事务ISession实例进入一个中断/无效的状态,此后不会保留任何记录,每次NHibernat都会引发另一个异常,告诉我第一次出现的问题 我曾使用过类似于刷新、清除、关闭等ISession方法,但我的问题仍然存在。另一种方法是从ISessionFactory请求另一个ISession实例,但当我使用此方法时,另一个奇怪的问题是:非法尝试将集合与两个打开的会话相关联

我对NHibernate
ISession
有问题。当我试图将错误的内容持久保存到数据库中(例如,在XYZ列上保存具有重复键的实体)并回滚
事务
ISession
实例进入一个中断/无效的状态,此后不会保留任何记录,每次
NHibernat
都会引发另一个异常,告诉我第一次出现的问题

我曾使用过类似于刷新、清除、关闭等ISession方法,但我的问题仍然存在。另一种方法是从
ISessionFactory
请求另一个
ISession
实例,但当我使用此方法时,另一个奇怪的问题是:
非法尝试将集合与两个打开的会话相关联

如何恢复ISession实例而无需从ISessionFactory重新请求另一个实例


提前感谢:)

你不能,也不应该

如果事务失败,则必须中止请求并显示错误

逻辑推论是,会话异常不应该是常规流程的一部分

现在,由于您使用的是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();
}

您无法恢复会话。发件人:

如果ISession抛出异常,则应立即回滚 事务,调用ISession.Close()并放弃ISession 例如。某些ISession方法将不会在一段时间内离开会话 一致状态


同样,也没有理由尝试重用它。如果您有MVC应用程序,您可能希望每个请求都有ISession。

您在这个模型上有lazyload属性吗?是的!如果您请求某些属性,那么大量延迟加载的属性(导航、集合)可能是一个问题。