在NHibernate中管理会话的最佳方法?

时间:2020-03-05 18:44:28  来源:igfitidea点击:

我是NHibernate的新手(我的第一个大型项目)。
我一直在使用一种简单的数据访问方法,方法是在using块内创建ISession对象来抓取我的Object或者Objects列表,这样退出代码块后,该会话被破坏了。

但是,这在需要延迟加载的情况下不起作用。
例如,如果我有一个Customer对象,它的属性是Orders的集合,那么当尝试延迟加载时,我会收到一个Hibernate异常。
有人使用其他方法吗?

解决方案

回答

在整个工作单元中保持会话开放。如果会话寿命太短,则无法从会话级缓存中受益(这很重要)。任何时候我们都可以防止往返数据库节省大量时间。我们也不能利用延迟加载,这对于理解至关重要。

如果会话寿命太大,则可能会遇到其他问题。

如果这是一个Web应用程序,则可以使用session-per-httpRequest模式进行处理。基本上,这是一个HttpModule,它在请求开始时打开会话,并在结束时刷新/关闭。确保将会话存储在HttpContext.Items不是静态变量中。 <-导致各种我们不想处理的问题。

我们也可以在RhinoCommons中查看工作单元的实现。

回答

请查看SummerOfNHibernate网络广播,以获取出色的教程。我们正在寻找的内容直到webisode 5或者6才出现。

回答

会话管理:

http://code.google.com/p/dot-net-reference-app/source/browse/trunk/src/Infrastructure/Impl/HybridSessionBuilder.cs

每个请求的会话:

http://code.google.com/p/dot-net-reference-app/source/browse/trunk/src/Infrastructure/Impl/NHibernateSessionModule.cs

回答

由于我们正在开发Web应用程序(大概是使用ASP.NET),因此请在CodeProject上使用ASP.NET查看NHibernate最佳实践。