NHibernate Transaction Service实现示例

时间:2011-12-11 10:02:58

标签: nhibernate session fluent-nhibernate transactions lazy-loading

我在检索域名对象时不断收到以下消息:

failed to lazily initialize a collection of role no session or session was closed

我知道问题与我的域对象上的延迟加载集合有关,我正在尝试解决这个问题,但如果有人能指出我正确的方向,那就太好了。问题是我在我的会话对象上有一个using语句,我想摆脱我的存储库类中的会话。

Stefan Steinegger建议使用TransactionService来管理以下帖子中的交易:

有人可以提供教程,例如如何实现这样的服务,这将是一件好事。

1 个答案:

答案 0 :(得分:1)

您可以通过几种不同的方式在Web应用程序中处理此问题,可能 Web应用程序中最常见的是每个Web请求的会话。

Application_Start的{​​{1}}内,创建SessionFactory并将其分配给静态属性:

global.asax.cs

然后,在public static ISessionFactory SessionFactory { get; private set; } protected void Application_Start(object sender, EventArgs e) { // your configuration setup var configuration = new NHibernate.Cfg.Configuration().Configure(); SessionFactory = configuration.BuildSessionFactory(); } 中的Application_BeginRequest中,使用SessionFactory打开会话并将其绑定到global.asax.cs

CurrentSessionContext

并在protected void Application_BeginRequest(object sender, EventArgs e) { var session = SessionFactory.OpenSession(); CurrentSessionContext.Bind(session); } 的{​​{1}}中取消绑定会话并将其丢弃

Application_EndRequest

现在在应用程序内部,只要需要会话,我们只需要global.asax.cs询问当前会话

protected void Application_EndRequest(object sender, EventArgs e)
{
    var session = CurrentSessionContext.Unbind(SessionFactory);
    session.Dispose();
}

这有很多变化,包括使用LazySessionContext只在需要一个会话时懒惰地创建会话,以及通过依赖注入将SessionFactory注入到控制器中的实现。