我在检索域名对象时不断收到以下消息:
failed to lazily initialize a collection of role no session or session was closed
我知道问题与我的域对象上的延迟加载集合有关,我正在尝试解决这个问题,但如果有人能指出我正确的方向,那就太好了。问题是我在我的会话对象上有一个using语句,我想摆脱我的存储库类中的会话。
Stefan Steinegger建议使用TransactionService来管理以下帖子中的交易:
有人可以提供教程,例如如何实现这样的服务,这将是一件好事。
答案 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
注入到控制器中的实现。