【问题标题】:Correct way of bootstrapping NHibernate in MVC在 MVC 中引导 NHibernate 的正确方法
【发布时间】:2010-09-09 09:23:33
【问题描述】:

我需要在 MVC 中设置会话管理。这样做的正确方法是什么? 如何使用结构映射在 mvc 中设置 nhibernate 会话管理,所以我不明白:

会话已关闭 或者 在多个线程中使用单个 Session 可能是一个错误。

我目前的配置是: 在 GlobalAssax 中:

protected void Application_Start()
    {
        ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
        Bootstrapper.ConfigureStructureMap();
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);

    }

在我的 BootStrapper 中我这样做:

var cfg = NHibernateManager.Configuration(assembly);
For<Configuration>().Singleton().Use(cfg);
For<ISessionFactory>().Singleton().Use(cfg.BuildSessionFactory());
For<ISession>().HttpContextScoped().Use(ctx => ctx.GetInstance<ISessionFactory>().OpenSession());

我将 ISession 注入到我在应用层使用的存储库中。

编辑:如果我这样做会发生什么?: For().LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.PerRequest)).Use(ctx => ctx.GetInstance().OpenSession());

【问题讨论】:

  • 您是否在应用程序中的任何位置调用 Dispose 或在会话周围使用 using 子句?如果是这样,请删除它,因为您让 StructureMap 处理生命周期。

标签: nhibernate model-view-controller structuremap


【解决方案1】:

您是否为会话添加了处置?

//In Global.asax.cs
protected void Application_EndRequest()
{
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}

否则看起来是正确的。

【讨论】:

  • 是的,现在如果我在 EndRequest 中添加了 dispose,我会在某些查询中得到 Session Is closed 异常。如果我不添加上述处理,我会得到线程异常。
  • @Luka - 你查看过 NHibernate 日志并看到发生了什么吗? stackoverflow.com/questions/743323/nhibernate-enabling-log4net
  • 是的,并且没有错误。最后几行说:积极释放数据库连接,关闭连接。我的操作没有获得任何连接
  • 抱歉,我没办法了。我猜你必须通过应用程序跟踪/调试,如果调试时出现问题,找出关闭会话的原因。
  • Automapper 引起的错误
猜你喜欢
  • 2010-10-30
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
相关资源
最近更新 更多