我遇到了NH(v2.1.2)的问题,在我刷新了该会话中修改过的唯一实体之后仍然认为会话是脏的。
我使用此映射设置了parent->子关系,如下所示:
<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 - 虽然我希望错误,因为我刷新了唯一被修改的项目。
通过调试器深入研究SessionImpl,我可以看到NH在它的ActionQueue中仍然有一个待处理的插入新的ChildItem。
在这种情况下,是否可以将会话返回到IsDirty()= false状态?我不想为此放弃整个会议。
任何帮助非常感谢!谢谢!
答案 0 :(得分:1)
好的,所以这个似乎没有答案。 最终似乎放弃了工作会议是放弃变革的唯一方法。这意味着一天左右的重构/重新测试,但现在已经开始运行。
答案 1 :(得分:0)
您可以尝试以下操作而不是Refresh()
。这是Refresh()
问题的常用解决方法,但我不知道它是否会对您的情况有所帮助。
session.Evict(parent);
session.Load(parent, parent.Id);