必须Nhibernate Session.Evict()作用于代理对象吗? (或者是否有另一种克隆持久化对象图的方法?)

时间:2016-06-07 08:15:48

标签: c# session nhibernate evict

我正在尝试创建一个持久化对象图的克隆,看起来像Session.Evict(PersistedObject)就是这样做的方法。通过从Session缓存中删除实例,我可以将其设置为新的“克隆”记录。

我尝试了三种方法,但都没有成功。

  1. 使用预先加载来从数据库中获取我的对象图并尝试逐出它。这会导致KeyNotFoundException
  2. 使用Session.Load(objectId)并尝试逐出它。 Evict有效,但我只有代理才能使用,而不是我需要的水合物
  3. 使用Session.Get(objectId)并尝试将其逐出。这会导致KeyNotFoundException
  4. 我很难找到关于这个主题的任何真实文档或示例。我找到了一些接近但没有真正解释我出错的地方

    关于最后一个链接,我检查了我的Equals和GetHashCode方法,但是在调用Evict时它们没有被击中。此外,Session.Contains(objectToBeEvicted)在Evict()之前返回true

    至于标题中的第二个问题 - 是否有更好的方法来解决这个问题?这不是一种罕见的情况

    提前致谢

2 个答案:

答案 0 :(得分:1)

回答最初的问题:

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

答案 1 :(得分:0)

尝试对对象进行深度克隆(.Net Deep cloning - what is the best way to do that?),然后将其添加到会话中。