NHibernate正确的方法将缓存的实体重新连接到不同的会话

时间:2010-05-28 21:42:16

标签: c# nhibernate caching lazy-loading

我正在使用NHibernate查询数据库中的对象列表。在我获得对象列表后,我遍历对象列表并应用距离近似算法来查找最近的对象。我认为这个获取对象列表并将算法应用于它们的函数是一个繁重的操作,所以我在HttpRuntime.Cache中缓存了我从算法中找到的对象。

在此之后每当我再次给出提供的输入时,我可以直接从Cache中拉出对象而不必访问数据库并遍历列表。我的对象是一个复杂的对象,它有附加到它的集合,在查询中我返回完整的对象列表,我没有急切地带回任何子集合,所以当我读取我的缓存对象时,我需要延迟加载才能正常工作能够完全显示对象。

最初我尝试使用它将我的缓存对象重新关联回新会话

_session.Lock(obj, LockMode.None);

但是,当从另一个实例同时访问该页面时,我收到错误

  

非法尝试关联   收集两个公开会议

然后我尝试了与

不同的东西
_session.Merge(obj);

然而,在NHProf中观察它的输出显示它正在删除并重新关联我的对象包含的集合与我的对象,这不是我想要的,虽然它似乎工作正常。

这样做的正确方法是什么?这些似乎都不对。

1 个答案:

答案 0 :(得分:1)

Lock应该有效。我认为您的问题是原始会话尚未处理。在缓存对象后尝试处理原始会话。