我对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实例?
提前致谢:)
答案 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。