这是我今天遇到的另一个奇怪的问题!我创建了使用nhibernate的MVC 4应用程序。并在我的HomeController上添加了名为[LoggingNHibernateSessionAttribute]的过滤器属性,该属性管理每个操作的会话。我遵循'ASP.NET MVC4和Apress发布的Web API'。NHibernate会话关闭时,页面
public class LoggingNHibernateSessionAttribute : ActionFilterAttribute
{
private readonly IActionLogHelper _actionLogHelper;
private readonly IActionExceptionHandler _actionExceptionHandler;
private readonly IActionTransactionHelper _actionTransactionHelper;
public LoggingNHibernateSessionAttribute()
: this(WebContainerManager.Get<IActionLogHelper>(),
WebContainerManager.Get<IActionExceptionHandler>(),
WebContainerManager.Get<IActionTransactionHelper>())
{
}
public LoggingNHibernateSessionAttribute(
IActionLogHelper actionLogHelper,
IActionExceptionHandler actionExceptionHandler,
IActionTransactionHelper actionTransactionHelper)
{
_actionLogHelper = actionLogHelper;
_actionExceptionHandler = actionExceptionHandler;
_actionTransactionHelper = actionTransactionHelper;
}
public override void OnActionExecuting(ActionExecutingContext actionExectingContext)
{
_actionLogHelper.LogEntry(actionExectingContext.ActionDescriptor);
_actionTransactionHelper.BeginTransaction();
}
public override void OnActionExecuted(ActionExecutedContext actionExecutedContext)
{
_actionTransactionHelper.EndTransaction(actionExecutedContext);
_actionTransactionHelper.CloseSession();
_actionExceptionHandler.HandleException(actionExecutedContext);
_actionLogHelper.LogExit(actionExecutedContext.ActionDescriptor);
}
}
ActionTransactionHelper
public class ActionTransactionHelper : IActionTransactionHelper
{
private readonly ISessionFactory _sessionFactory;
private readonly ICurrentSessionContextAdapter _currentSessionContextAdapter;
public ActionTransactionHelper(
ISessionFactory sessionFactory,
ICurrentSessionContextAdapter currentSessionContextAdapter)
{
_sessionFactory = sessionFactory;
_currentSessionContextAdapter = currentSessionContextAdapter;
}
public void BeginTransaction()
{
var session = _sessionFactory.GetCurrentSession();
if (session != null)
{
session.BeginTransaction();
}
}
public bool TransactionHandled { get; private set; }
public void EndTransaction(ActionExecutedContext filterContext)
{
var session = _sessionFactory.GetCurrentSession();
if (session == null) return;
if (!session.Transaction.IsActive) return;
if (filterContext.Exception == null)
{
session.Flush();
session.Transaction.Commit();
}
else
{
session.Transaction.Rollback();
}
TransactionHandled = true;
}
public bool SessionClosed { get; private set; }
public void CloseSession()
{
if (_currentSessionContextAdapter.HasBind(_sessionFactory))
{
var session = _sessionFactory.GetCurrentSession();
session.Close();
session.Dispose();
_currentSessionContextAdapter.Unbind(_sessionFactory);
SessionClosed = true;
}
}
}
运行应用程序时,我可以在数据库中保存的实体。但是当我点击刷新按钮和异常抛出指示会话关闭。
我不知道为什么会发生这种情况。 (我搜索并找到这个NHibernate throwing Session is closed,但无法解决我的问题)。
在我的NinjectConfigurator中,我将inRequestScope()添加到所有注入但没有答案。我检查了什么时候刷新页面会话将被打开。但我不知道它为什么说会议闭幕?!
UPDATE:
当我第一次运行该应用程序。我可以创建一个新成员。但是当我点击刷新按钮时,会话将意外关闭! 第一次运行:
- 一切击中刷新按钮后,效果很好
:
- 一个新的会话绑定到当前上下文。
- 新的会话将被注入该库(会话是打开的)
- 的ActionTransactionHelper调用的BeginTransaction() 4- customMembership的createUser(....)称为 5但当_userRepositoy.save(用户)称为在存储库会话关闭!!!!
注意:但是当仍然没有调用endTransaction和closeSession时。但会议如何关闭?如果我在onActionExecute()中注释closeSession(),则返回 。会话一直开放,如果刷新页面,一切都会很好。 我查了很多,并尝试了我认识的不同方式。它只发生在我第二次想用我的customMembership进行CRUD操作时。
对于其他实体,它的作用就像一个魅力! 我已经上传了我的示例代码。用于测试只需创建并清空数据库并更改连接字符串。然后去到localhost:*****/API /类别(用户,并通过不要求)
下载示例项目: 大小:47 MB https://www.dropbox.com/s/o63wjng5f799fii/Hashem-MVC4ServicesBook.rar
大小:54 MB Zip格式: https://www.dropbox.com/s/smrsbz4cbtznx1y/Hashem-MVC4ServicesBook2.zip
上传的示例代码。请检查。 –