NHibernate / Spring.Net / Asp.Net WebForms - 按请求打开事务

时间:2011-09-02 22:41:32

标签: asp.net nhibernate spring.net

我目前正在使用Spring.Net的NHibernate并使用Spring的Open Session In View模块。据我所知,此模块仅在BeginRequest上打开会话并在EndRequest上关闭它。它实际上并没有在EndRequest上提交或刷新会话。

我知道您可以使用Spring的[Transaction]属性来修饰单个服务方法,这些方法将在方法结束时执行提交,但我不想使用此技术。

有没有办法设置Spring的OSIV模块,以便它会刷新EndRequest上的会话?如果没有,是否有一种简单的方法可以实现我自己的Open Session In View实现这一目标?

我尝试在NH 3 Cookbook中实现“每个Web请求的会话”示例,但它在CurrentSessionContext上抛出错误:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var sessionFactory = (ISessionFactory) ContextRegistry.GetContext().GetObject("MySessionFactory");
        var session = sessionFactory.OpenSession(); 
        CurrentSessionContext.Bind(session);
    }

    protected void Application_EndRequest(object sender, EventArgs e)
    {
        var sessionFactory = (ISessionFactory)ContextRegistry.GetContext().GetObject("MySessionFactory");
        var session = CurrentSessionContext.Unbind(sessionFactory);
        session.Dispose();
    }

注意:上面的代码只试图复制Spring.Net目前正在做的事情。我计划在我开始工作后更新它以刷新会话。

我假设上面的代码无效,因为我使用Spring.Net来设置NH及其SessionFactory,这可能会使本书中的示例无效。

非常感谢任何帮助/建议。

我正在使用NHibernate 3.2和Spring 1.3.2

编辑:

阅读http://forum.springsource.org/archive/index.php/t-16949.html后,我开始怀疑每个请求的交易是否是个好主意。

2 个答案:

答案 0 :(得分:2)

为什么将刷新模式设置为FlushMode.NEVER有一些强有力的理由:http://forum.springframework.net/showthread.php?3303-OpenSessionInViewModule

   Erich Eichinger(SpringSource GmbH)

     

OSIV上的FlushMode.NEVER是设计使然。这是因为如果OSIV   在“EndRequest”期间刷新挂起的更改并发生错误,全部   响应已经发送给客户端。没有办法   告诉客户有关错误的信息。因此有可能改变   默认FlushMode但我不推荐它。

那就是说,有一个没有文档的功能。您可以通过在appSettings中设置web.config键/值对来设置刷新模式:

<configuration>
  <appSettings>
    ...
    <add 
      key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.DefaultFlushMode"
      value="Auto" 
      />
  </appSettings>
  ...
</configuration>

答案 1 :(得分:-1)

我不熟悉Spring.NET,但是:会话工厂应该只适用于整个应用程序。详情here。 会话在每个请求开始时打开。

我不知道这是否在NH3中发生了变化,但在我们的NH 2应用程序中,我们以这种方式构建会话工厂:

NHibernateConfiguration.BuildSessionFactory()