关于c#:在NHibernate中管理会话的最佳方法?

关于c#:在NHibernate中管理会话的最佳方法?

Best way to manage session in NHibernate?

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

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


会话管理:

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


查看SummerOfNHibernate网络广播以获取出色的教程...在Webisode 5或6之前,您所需要的只是具体的内容。


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

如果会话生存期太大,则可能会遇到其他问题。

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

您也可以在RhinoCommons上找到工作实现单元。


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


推荐阅读