基本执行顺序:
- 查询集合,
PersistentObjects
然后与会话分开缓存。 - 该集合被传递给一个模块,该模块需要将它们重新附加到会话中,以便延迟加载某些属性(使用
session.Lock(obj, LockMode.None)
)。 - 在模块完成处理后,另一个模块会尝试为初始化该操作的用户提供一些使用统计信息
SaveOrUpdate
的对象。UserSetting
- 在
session.Flush()
NHibernate 上抛出一个NonUniqueObjectException
.
我发现解决此问题的一种方法是获取对象的新副本:
obj = session.Get(obj.GetType(), (obj as PersistentObject).Id);
而不是重新附加session.Lock
. 然而,这并不是最优的,因为一些记录集可能非常大,并且单独重新获取每个对象可能会拖累性能。
非唯一的对象是仅存在于PersistentObject
类而不存在于类上的引用对象UserSetting
。所以我不明白为什么刷新会导致这个异常。
我已经尝试在模块完成后驱逐缓存的对象,但这无济于事。
有谁知道将对象附加到可以避免此问题的会话的更好方法?