NHibernate应该如何更新映射为版本的属性

NHibernate应该如何更新映射为版本的属性,nhibernate,fluent-nhibernate,staleobjectstate,Nhibernate,Fluent Nhibernate,Staleobjectstate,使用fluent NHibernate,我在使用Version Version(x => x.Version); 当我保存对象时,数据库中的Version属性会像我预期的那样递增,但是对象上的属性值似乎只是有时会改变 using (var tx = session.BeginTransaction()) { session.Merge(item); tx.Commit(); item.Version; // Sometimes this is still 1,

使用fluent NHibernate,我在使用
Version

Version(x => x.Version);
当我保存对象时,数据库中的Version属性会像我预期的那样递增,但是对象上的属性值似乎只是有时会改变

using (var tx = session.BeginTransaction())
{
    session.Merge(item);
    tx.Commit();

    item.Version;  // Sometimes this is still 1, when I expect it to be 2.
}
问题是,如果它保持为1,并且我进行了更多更改并再次保存,则会得到一个StaleObjectStateException

奇怪的是,有时它工作正常,item.Version值确实正确地递增,但我无法找出它的递增情况和不递增情况之间的区别

我尝试过搜索,但似乎找不到任何关于此的文档。有人能解释NHibernates在版本映射中的预期行为吗


[NHibernate版本2.1.2]

在更新的版本传播到您的实体之前,您需要刷新会话。除非刷新会话,否则您有责任使实体保持最新


通常,当会话关闭时,应该让会话自行刷新。但是,在某些情况下,如果依赖于通过nhibernate进行的数据库更新,而不是对实体本身进行的设置,则可能需要在提交后自行刷新会话。在这种情况下,请注意,当刷新会话时,将提交任何脏的实体。这可能不可取,因此请确保范围非常有限。

来自
会话。合并
文档:

将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话关联的持久实例,则将加载该实例。返回持久实例。如果给定实例未保存,请保存其副本并将其作为新的持久实例返回。给定实例不会与会话关联

因此,它将修改

(我可能要补充的是,我从未在我的应用程序中使用过
Merge
。您可能想查看如何处理连接和分离的实体)

您尝试过吗

item = session.Merge(item);
tx.Commit();

谢谢。刷新会话有什么影响?(应用程序很大,我希望小心不要对其他领域产生任何影响。我知道此会话对象正在多个地方使用)。我应该在提交之前还是之后刷新?修改了我的答案,以根据tx扩展何时刷新。commit()刷新会话并自动提交事务。(由于这种应用程序体系结构,会话对象将保持打开状态相当长的一段时间。无论是好是坏,在这个阶段都没有真正的选项来更改它。我不确定这是否对任何事情都有影响)好的,我现在已经试过了,但仍然不起作用。我尝试在提交后调用session.Flush(),但没有任何区别。它仍然不会更新正在保存的项目的版本值。(初始创建工作正常,版本设置为1,然后总是第一次更新无法将版本设置为2。一旦我重新加载对象,后续更新似乎都能正常工作。(哦,我忘了提到。它使用的是NHibernate版本2.1.2)这很有趣,因为它有时似乎会工作。初始创建工作正常,版本设置为1,然后总是第一次更新无法将版本设置为2。一旦我重新加载对象,后续更新似乎都会自动增加版本。(哦,我忘了提。它使用的是NHibernate版本2.1.2)@SimonPStevens:我不知道这个具体问题,但是2.1.2已经有一段时间不受支持了,并且有一些与合并相关的更改。我建议您升级。不幸的是,更新目前不是一个选项。它在下一个版本的计划中,但现在无法完成。[抱歉,忘记最后的评论]。这确实有效。你知道为什么有时候只需要这样做吗。使用我的原始代码,初始创建工作正常,版本设置为1,然后总是第一次更新无法将版本设置为2。一旦我重新加载对象,后续更新似乎都会自动增加版本。知道为什么我需要使用仅在第二次保存时返回对象?您是否有任何问题?如果没有,您能否演示如何打开事务?您是否使用FlushMode执行任何操作?这些问题的答案可以帮助解释为什么它有时会起作用。FlushMode没有做任何操作。我们只是“使用(var tx=session.BeginTransaction())”打开事务。在解释该部分之前,我必须更详细地研究缓存。如果我无法从这里理解,我将问一个新问题。谢谢您的帮助。