我在一个新的ASP.NET项目中使用NHibernate,并且遇到了我认为奇怪的行为。我试图通过使用HttpModule来捕获EndRequest事件并关闭会话来管理我的会话。这工作正常,但是,在EndRequest事件触发后,我在我的一个自定义控件的OnLoad事件中遇到异常,该事件试图从我的延迟加载的对象中读取一个属性。我得到一个例外,说明“未能懒惰地初始化集合,没有会话或会话被关闭”。关闭这些属性的延迟加载确实解决了问题,并且是可接受的解决方案。但这似乎违背了我一直认为的事实。
我认为OnLoad事件和所有服务器端处理都将在EndRequest被触发时完成。这也是我第一次在项目中使用IIS 7。这是行为的原因吗?预期的行为是什么?
答案 0 :(得分:2)
我只是有一个'掌心前额'的时刻。尽管事实上我正在部署到IIS 7服务器,但我一直在使用VS 2008内置Web服务器(Casini)进行调试。 Casini通过ASP.NET管道传递所有请求,而IIS则没有。这导致请求图像文件或javascript文件(或任何其他静态资源)关闭我的NHibernate会话,然后才真正认为它应该关闭。
感谢资源列表,我一定会研究它们。
答案 1 :(得分:1)
http://forum.springframework.org/showthread.php?t=13474
我还建议使用Rhino Commons中的HTTP模块来管理您的NHibernate会话。
答案 2 :(得分:1)
你应该使用一个shrinkwrapped包来解决这个问题。
我喜欢将Autofac与ASP.NET / MVC集成使用。您只需要RequestContainer
在需要时ISession
询问ISession
,IDisposable
是RequestContainer
,ISession
会自动知道处置{{1}} {{1}} 1}}当前请求结束时一切都为你照顾。
答案 3 :(得分:0)
如果你需要延迟加载,请使用HttpModule。继承你的类,然后你有两个方法可以覆盖(不记得他们的名字)。每次请求任何页面时都会调用第一个。在那里打开会话并将会话置于viewstate中。当回发页面时调用另一个方法,在那里关闭你的会话。