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

时间:2011-06-10 14:10:11

标签: nhibernate fluent-nhibernate staleobjectstate

使用流畅的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]

3 个答案:

答案 0 :(得分:2)

来自ISession.Merge文档:

  

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

因此,修改item

(我可以补充一点,我从未在我的应用中使用Merge。您可能想要查看如何处理附加和分离的实体)

答案 1 :(得分:1)

你试过吗

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

答案 2 :(得分:0)

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

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