1

基本执行顺序:

  1. 查询集合,PersistentObjects然后与会话分开缓存。
  2. 该集合被传递给一个模块,该模块需要将它们重新附加到会话中,以便延迟加载某些属性(使用session.Lock(obj, LockMode.None))。
  3. 在模块完成处理后,另一个模块会尝试为初始化该操作的用户提供一些使用统计信息SaveOrUpdate的对象。UserSetting
  4. session.Flush()NHibernate 上抛出一个NonUniqueObjectException.

我发现解决此问题的一种方法是获取对象的新副本:

obj = session.Get(obj.GetType(), (obj as PersistentObject).Id);

而不是重新附加session.Lock. 然而,这并不是最优的,因为一些记录集可能非常大,并且单独重新获取每个对象可能会拖累性能。

非唯一的对象是仅存在于PersistentObject类而不存在于类上的引用对象UserSetting。所以我不明白为什么刷新会导致这个异常。

我已经尝试在模块完成后驱逐缓存的对象,但这无济于事。

有谁知道将对象附加到可以避免此问题的会话的更好方法?

4

1 回答 1

3

您可以使用新的会话(或事务)来处理每个项目并更新用户设置吗?这可能会阻止 NonUniqueException。

干杯,

-马丁

于 2009-08-14T20:24:45.857 回答