1

我一直在尝试使用 ISession.Merge() 来保持两个会话之间的一致性,但是当合并的实例具有比会话中加载的版本更高的版本属性时(带有 StaleObjectStateException),它会失败。

当版本字段不匹配时,是否有替代方法可以使用?

4

2 回答 2

0

尝试调用:

Session.Lock(string entityName, object obj, LockMode lockMode);

使用 LockMode.Force。该方法的注释说明:

这可用于执行版本检查 (NHibernate.LockMode.Read),升级到悲观锁 (NHibernate.LockMode.Upgrade),或简单地将瞬态实例与会话 (NHibernate.LockMode.None) 重新关联。如果关联使用 cascade="lock" 映射,则此操作级联到关联实例。

对于 LockMode.Force:

与 NHibernate.LockMode.Upgrade 类似,不同之处在于,对于版本化实体,它会导致强制版本增量。

于 2011-07-27T20:22:52.327 回答
0

似乎没有任何方法可以安全地在会话之间合并实体,至少使用乐观锁定。

我将采用另一种模式:每个会话都有每个实体的自己的副本,并且我refresh()根据需要在每个会话上创建实例。这增加了内存使用和数据库往返的开销,但它似乎有效。

于 2011-08-08T13:30:45.280 回答