【问题标题】:NHibernate - after Refresh Session is still dirtyNHibernate - 刷新会话后仍然脏
【发布时间】:2011-10-19 01:44:12
【问题描述】:

在我刷新了在该会话中修改的唯一实体后,我仍然认为该会话是脏的 NH (v2.1.2) 遇到了问题。

我有一个使用这个映射设置的父->子关系,如下所示:

<set name="ChildItem" access="field.camelcase-underscore"
     lazy="true"
     cascade="save-update"
     inverse="true">
  <key column="PARENT_ITEM_KEY"/>
  <one-to-many class="....ChildItem"/>
</set>

重现问题的步骤如下:

1 - 创建新的 ChildItem 并将其添加到 Parent 的集合中,但不要保存它。现在 session.IsDirty() 返回 true(如预期的那样)。

2 - 调用 session.Refresh(parent) 来恢复我的更改。刷新后,父项的集合现在不包含新的子项(如预期的那样)。

3 - 现在 session.IsDirty() 返回 true - 虽然我希望是 false,因为我已经刷新了唯一被修改的项目。

通过调试器深入了解 SessionImpl,我可以看到 NH 在它的 ActionQueue 中仍有新 ChildItem 的待处理插入。

在这种情况下是否可以将会话返回到 IsDirty()=false 状态?我不想为此放弃整个会话。

非常感谢任何帮助!谢谢!

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    好的,所以这个问题似乎没有答案。 最后,似乎放弃工作会话是放弃更改的唯一方法。这意味着一天左右的重构/重新测试,但它现在已经启动并运行了。

    【讨论】:

      【解决方案2】:

      您可以尝试以下方法而不是 Refresh()。这是Refresh() 问题的常用解决方法,但我不知道它是否对您有帮助。

      session.Evict(parent);
      session.Load(parent, parent.Id);
      

      【讨论】:

      • 谢谢,但这仍然对我没有帮助。无论我是刷新还是驱逐父实体,NH 会话仍然返回 IsDirty() = true .. 即它仍然认为它有一个等待插入的临时子实体。
      猜你喜欢
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2014-03-11
      • 2013-09-12
      相关资源
      最近更新 更多