如何在ASP.NET WebForms应用程序中处理NHibernate会话?

时间:2010-07-16 02:05:45

标签: c# .net asp.net nhibernate

我看到会话处理有两种可能的情况:

  1. 按请求打开一个ISession。在请求开始时打开它,并在请求结束时关闭它。
  2. 根据概念“工作单元”打开一个ISession。为请求创建了许多会话。
  3. 方法#1是我现在正在做的那个。我有点担心它,因为虽然它有效,但调试起来有点困难。例如,我有一个没有保存的对象(即使我订购了它)而且我在调试时遇到问题,因为在完整的请求生命周期中发生了很多事情。

    方法#2似乎是标准的最佳实践(不确定ASP.NET),我确信它更容易调试。我看到的问题是关于会话间通信。例如:My Page类包含对User的引用,User是一个持久对象。许多操作都将用户作为参数接收。由于用户属于不同的会话,因此我无法将其作为参数传递。

    我偏向于#2,但我不知道这是最好的做法,也不知道如何处理跨会话对象。

    感谢。

4 个答案:

答案 0 :(得分:1)

大多数人都会根据您概述的原因进行每次请求会话。

但是,您可以为每个“工作单元”打开并提交事务。因此,每个会话都会有很多事务。 (通常的做法是确保在提交事务时,同时刷新会话。)

例如,单击“保存”按钮后,打开并提交事务。

会话将负责跟踪您的所有实体。必要时,事务将负责刷新数据库。

通过此设置,您可以更轻松地调试问题。

答案 1 :(得分:1)

对于我现在正在研究的ASP.NET项目,我使用了这些方法的组合。

我在请求开始时打开一个ISession,并在请求结束时关闭它,就像使用第一种方法一样,我使用会话加载任何需要保持附加到会话的实体请求的持续时间。

但是,当我需要保存或更新或删除实体时,我会创建一个新的临时对象并将其交给新的ISession,与请求绑定的ISession分开。对于其他工作单元,我创建了其他会话。

答案 2 :(得分:0)

您可能会发现NHibernate Burrow在这方面很有帮助,或者至少有趣,因为它旨在协助ASP .NET应用程序中的会话管理,实现跨越多个“长时间运行的对话”的概念请求。

答案 3 :(得分:0)

我认为你真正的问题是为什么我无法保存我的物品。

即使您认为使用的是单个ISession,您仍然需要刷新会话或提交事务以便提交某些保存/更新/删除操作。