我一直试图使用ISession.Merge()来保持两个会话之间的一致性,但当合并实例的版本属性高于会话中加载的版本(具有StaleObjectStateException)时,它失败。ISession.Merge()在使用乐观锁定时不会抛出异常吗?
当版本字段不匹配时,是否有另一种方法可行?
我一直试图使用ISession.Merge()来保持两个会话之间的一致性,但当合并实例的版本属性高于会话中加载的版本(具有StaleObjectStateException)时,它失败。ISession.Merge()在使用乐观锁定时不会抛出异常吗?
当版本字段不匹配时,是否有另一种方法可行?
似乎没有任何方法可以在会话之间安全地合并实体,至少在乐观锁定的情况下。
我正在采用另一种模式:每个会话都有自己的每个实体的副本,并根据需要在每个会话中使用我的refresh()
实例。这增加了内存使用和往返数据库的开销,但似乎可行。
尝试调用:
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,对于版本 实体,它会导致强迫版本增量。
文档和litterature else让我认为LockMode.Force将强制写一个新的版本到数据库,而不是得到最新的状态......我会看看我可以用它做什么。 –
确认后,LockMode.Force强制NHibernate发送SQL更新,这与我在这里想要的相反。 –