gpt4 book ai didi

c# - hibernate ;控制何时保存 Session Per Request

转载 作者:行者123 更新时间:2023-11-30 22:35:09 25 4
gpt4 key购买 nike

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

主要关注的是当 Web 请求完成时,对象会自动保存到数据库中。我对此不是特别满意,并且更喜欢某种方式来采取更积极的方法来决定请求完成时实际保存的内容。这可以通过 Session Per Request 方法实现吗?

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

  1. 从数据库中检索对象或创建一个新对象
  2. 以某种方式修改它
  3. 对对象调用保存方法,验证它确实已准备好提交到数据库
  4. 对象被保存到数据库

如果我使用 Sessions Per Request 模型并将交互包装在 using session /using 交易 block 。我在采用这种方法时遇到的问题是,从数据库加载对象后, session 关闭,我无法使用延迟加载。大多数情况下这没问题,但有一些对象具有其他对象的列表,这些对象无法修改,因为如前所述, session 已关闭。我知道我可以急切地加载这些对象,但它们并不总是被使用,我觉得这样做我无法利用 NHibernate。

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

最佳答案

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

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

使用这种方法, session 在请求生命周期内打开,因此延迟加载可以工作,但事务范围会受到您认为合适的限制。在我看来,使用 transaction-per-request 是一种不好的做法。事务应该紧凑并包围数据访问代码。

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

关于c# - hibernate ;控制何时保存 Session Per Request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7523142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com