2016-06-07 25 views
0

我想创建一个持久对象图的克隆,它似乎像Session.Evict(PersistedObject)是这样做的方式。通过从Session缓存中删除实例,我可以将其设置为新的“克隆”记录。必须Nhibernate Session.Evict()作用于代理对象吗? (或者是有克隆持久对象图的替代方法?)

我尝试了三种方法,每种方法都不成功。

  1. 使用急切加载从数据库中获取我的对象图并尝试将其退出。这会导致KeyNotFoundException异常
  2. 使用Session.Load(objectId)并尝试将其驱逐出去。 Evict的作品,但我只有一个代理工作,而不是我需要的水合物体
  3. 使用Session.Get(objectId)并尝试将它驱除。这导致KeyNotFoundException

我一直在努力寻找关于此主题的任何真实文档或示例。我发现了一些接近,但没有真正解释了我要去哪里错了

随着关于最后一个链接,我检查了我的Equals和GetHashC ode方法,但在调用Evict时不会受到影响。另外,Session.Contains(objectToBeEvicted)在Evict之前返回true()

至于标题中的第二个问题 - 是否有更好的方法来解决这个问题?这不可能是这样一个难得的场景

在此先感谢

回答

0

要回答最初的问题:

不,Evict()不限于作用于代理,它可以从会议中删除任何对象。如果你遇到某种异常,很可能你做错了什么,但是这个问题没有包含足够的信息来弄清楚什么。

+0

谢谢 - 我认为它没有任何意义,它只能作用于代理。为了获得我想要驱逐的对象,我正在使用QueryOver查询并急切地加载子集合。所以我想要Evict的对象是一个完整的对象图。还有什么我会省略的,可以帮助你理解场景? –