【问题标题】:Why evicting objects from Session does not commit changes to database?为什么从 Session 中驱逐对象不会提交对数据库的更改?
【发布时间】:2012-02-16 05:04:24
【问题描述】:

我在我的应用程序中使用 NHibernate 并且有以下情况。 (注意这里的情况为了便于理解简化了很多)

从数据库中查询一个对象。使用Session.Update() 对其进行编辑和更新。然后在提交事务之前将对象从会话中逐出(使用Session.Evict(obj))。预期结果是将更改持久化到数据库中。

当我将我的 Id 列作为 NHibernate identity 列时,这曾经可以正常工作。 最近,我们将 Id 列更改为 non-identity。因此,除非我在 Evict 之前显式调用 Session.Flush(),否则上述场景不会持续到数据库中。

有人可以向我指出/解释这种行为的原因吗?

这个链接NHibernate Session.Flush & Evict vs Clear 提到了一些关于 Evict 和身份列的内容,对我来说不是很清楚。

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    您的工作流程不正确。

    首先,当您从数据库中检索对象时,session.Update(entity) 不执行任何操作。更改将自动发生在Flush/Commit

    接下来,Evict 删除会话对对象的所有知识,因此它不会保留应用于它的任何更改。在正常情况下,您几乎不应该使用此方法,这让我认为您没有正确处理会话。

    第三,使用identity 会导致插入 立即在Save 上发生,这是一个限制,而不是一个功能。

    正确的工作流程是:

    using (var session = factory.OpenSession())
    using (var transaction = session.BeginTransaction())
    {
        var entity = session.Get<EntityType>(id);
        entity.SomeProperty = newValue;
        transaction.Commit();
    }
    

    确切结构(using 语句等)可以在桌面应用程序中更改,但基本思想是相同的。

    【讨论】:

    • 迭戈,你是对的。我们不得不求助于这种“糟糕”的技术,因为会话中加载了许多只读对象。当事务提交时,更改需要一些时间才能完成。因此,我们认为如果在查询对象后驱逐对象,我们可以减少会话中的对象。之后确实更新的对象稍后会自动重新附加到会话。我们的第一个错误是为此使用 NHibernate,但在我们可以将其从系统中删除之前,我们正在寻找一些解决方法来加快速度......
    • 这个特殊问题对我来说看起来很奇怪,因为在我进行更改之前,更新以某种方式被刷新到数据库中,即使在驱逐对象之后,我也可以看到更改。 NHibernate 的 AutoFlush 是否使用了一些依赖于标识列的逻辑来做到这一点?顺便说一句,这是在一个网络应用程序中,所以我们为每个请求创建一个会话并在最后提交它。该应用程序类似于 mini-salesforce.com,用户可以在其中编写自己的 IronPython 脚本。那是他们向我们想要驱逐的会话添加了很多只读对象。这给了我们一些性能提升。
    • 我通过在这些驱逐发生之前刷新会话来解决这个特殊问题。这段代码没有被广泛调用,因此我们现在还可以。然而,我们项目的最佳建议是在这一层替换 NHibernate
    【解决方案2】:

    身份强制 NHibernate 立即将实体保存到session.Save() 上的数据库中,非身份允许它批量插入以将它们作为一个整体发送。 Evict 将从会话中删除对象的所有信息。因此,即使会话不知道,它也会忘记它已经在数据库中的实体。

    可以补救

    • 设置Flushmode.Auto(强制立即刷新)
    • Evict之前调用session.Flush()
    • 交易完成后驱逐

    哪个是最佳选择取决于上下文

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多