ASP.NET MVC、NHibernate 会话和 NHibernate 事件

Posted

技术标签:

【中文标题】ASP.NET MVC、NHibernate 会话和 NHibernate 事件【英文标题】:ASP.NET MVC, NHibernate sessions, and NHibernate events 【发布时间】:2012-07-30 19:56:55 【问题描述】:

我在 ASP.NET MVC3 项目中使用 (Fluent) NHibernate。我正在使用通过实现自定义 HttpModule 为每个请求打开一个 NHibernate 会话的标准方法。会话在 BeginRequest 中打开并在 EndRequest 中关闭。

我正在连接到 Pre/Post Insert/Update 事件来为我的实体编写历史日志。当我尝试将实体保存在这些事件处理程序中时,就会出现问题。似乎在这些事件处理程序之前已经调用了 EndRequest,因此 NHibernate 会话已经关闭。

如何延迟会话的关闭以便保存历史实体?我在rhino commons 上查看了一些 HttpModules,但对于我的情况来说,这似乎有点矫枉过正。

【问题讨论】:

使用专用会话来执行这些任务,也许吧?我们还将这些事件用于审计目的,并在单独的会话中执行这些操作。 这些事件发生在事务中。你正在使用交易,对吧? @DiegoMijelshon 是的,请求中的所有内容都在事务中处理。问题是请求在事件处理程序被调用之前就结束了。 【参考方案1】:

您可能想查看 Ayende 的 this post。相信您会在 Revin Hart 制作的 cmets 中找到答案。 Ayende 和 Revin 谈到让子会话来处理保存更改日志实体。

ISession newSession = ev.Source.PersistenceContext.Session.GetSession();

foreach (ScheduleChangeLog changeLog in logs)

    changeLog.UpdatedBy = Username;
    newSession.Save(changeLog);

【讨论】:

完美!长话短说,我确实必须创建一个新会话。

以上是关于ASP.NET MVC、NHibernate 会话和 NHibernate 事件的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC+WCF+NHibernate+Autofac 框架组合

在 ASP.NET MVC 4 NHibernate 应用程序中使用 SessionFactory 获取连接

如何在 ASP.NET MVC 应用程序中管理和部署架构(使用 NHibernate)

Nhibernate in asp,net ISession 帮助

将 ASP.NET MVC NHibernate 应用程序部署到 IIS7 时出错

ASP.NET 中的 FluentNHibernate 会话管理