NHibernate的;控制何时保存Session Per Request

时间:2011-09-23 00:52:54

标签: c# nhibernate

我正在尝试使用NHibernate和 Session Per Request 模型开发 Web表单 应用程序。我见过的所有示例都有一个HTTPModule,它在每个请求的结束时创建会话和事务,然后提交事务并在请求结束时关闭会话。我有这个工作,但我有一些担忧。

主要关注的是,当Web请求完成时,对象会自动保存到数据库中。我对此并不是特别满意,并且更倾向于采用更积极的方法来确定请求完成时实际保存的内容。这是否可以使用Session Per Request方法?

理想情况下,我希望与数据库的交互能够像这样:

  1. 从数据库中检索对象或创建新对象
  2. 以某种方式修改
  3. 在对象上调用一个save方法,该方法验证它确实准备好提交到数据库
  4. 对象保存到数据库
  5. 如果我使用Sessions Per Request模型并将交互包装在using会话/ using事务块中,我就能完成此操作。我采用这种方法遇到的问题是,从数据库加载对象后,会话关闭,我无法使用延迟加载。大部分时间都可以,但是有一些对象具有其他对象的列表,然后无法修改,因为如上所述,会话已被关闭。我知道我可以急切地加载这些对象,但它们并不总是被使用,我觉得这样做我没有使用NHibernate。

    是否有某种方法可以使用Session Per Request(或任何其他模型,似乎最常见的一种),这将允许我使用延迟加载并为我提供一种方法来手动确定对象何时是保存回数据库?非常感谢任何代码,教程或反馈。

1 个答案:

答案 0 :(得分:3)

是的,这是可能的,您应该能够找到它的示例。我就是这样做的:

  • 使用session-per-request但不要在请求开始时启动事务。
  • 将ISession.FlushMode设置为Commit。
  • 根据需要使用单个交易(有时每个会话多次)。
  • 在会话结束时,如果存在活动的未提交事务,则抛出异常。如果会话是脏的,请将其刷新并记录警告。

使用此方法,会话在请求生命周期内打开,因此延迟加载有效,但事务范围受限于您认为合适。在我看来,使用每个请求的事务是一种不好的做法。交易应紧凑并围绕数据访问代码。

请注意,如果使用数据库分配的标识符(SQL Server中的标识列),NHibernate可能会在事务边界之外执行插入操作。延迟加载当然可以在事务之外发生(您也应该使用事务进行读取)。