我正在尝试使用NHibernate和 Session Per Request 模型开发 Web表单 应用程序。我见过的所有示例都有一个HTTPModule,它在每个请求的结束时创建会话和事务,然后提交事务并在请求结束时关闭会话。我有这个工作,但我有一些担忧。
主要关注的是,当Web请求完成时,对象会自动保存到数据库中。我对此并不是特别满意,并且更倾向于采用更积极的方法来确定请求完成时实际保存的内容。这是否可以使用Session Per Request方法?
理想情况下,我希望与数据库的交互能够像这样:
如果我不使用Sessions Per Request模型并将交互包装在using
会话/ using
事务块中,我就能完成此操作。我采用这种方法遇到的问题是,从数据库加载对象后,会话关闭,我无法使用延迟加载。大部分时间都可以,但是有一些对象具有其他对象的列表,然后无法修改,因为如上所述,会话已被关闭。我知道我可以急切地加载这些对象,但它们并不总是被使用,我觉得这样做我没有使用NHibernate。
是否有某种方法可以使用Session Per Request(或任何其他模型,似乎最常见的一种),这将允许我使用延迟加载并为我提供一种方法来手动确定对象何时是保存回数据库?非常感谢任何代码,教程或反馈。
答案 0 :(得分:3)
是的,这是可能的,您应该能够找到它的示例。我就是这样做的:
使用此方法,会话在请求生命周期内打开,因此延迟加载有效,但事务范围受限于您认为合适。在我看来,使用每个请求的事务是一种不好的做法。交易应紧凑并围绕数据访问代码。
请注意,如果使用数据库分配的标识符(SQL Server中的标识列),NHibernate可能会在事务边界之外执行插入操作。延迟加载当然可以在事务之外发生(您也应该使用事务进行读取)。