我一直在尝试使用 ISession.Merge() 来保持两个会话之间的一致性,但是当合并的实例具有比会话中加载的版本更高的版本属性时(带有 StaleObjectStateException),它会失败。
当版本字段不匹配时,是否有替代方法可以使用?
我一直在尝试使用 ISession.Merge() 来保持两个会话之间的一致性,但是当合并的实例具有比会话中加载的版本更高的版本属性时(带有 StaleObjectStateException),它会失败。
当版本字段不匹配时,是否有替代方法可以使用?
尝试调用:
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 类似,不同之处在于,对于版本化实体,它会导致强制版本增量。
似乎没有任何方法可以安全地在会话之间合并实体,至少使用乐观锁定。
我将采用另一种模式:每个会话都有每个实体的自己的副本,并且我refresh()
根据需要在每个会话上创建实例。这增加了内存使用和数据库往返的开销,但它似乎有效。