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