【问题标题】:Session evict and merge for entity update会话驱逐和合并实体更新
【发布时间】:2013-05-10 04:35:30
【问题描述】:

我找到了这段代码:

    public virtual void Update(T entity) {
        Logger.Debug("Update {0}", entity);
        Session.Evict(entity);
        Session.Merge(entity);
    }

您能解释一下在会话中调用更新而不是调用它的优点和缺点吗? 为什么这样有效,这段代码背后的机制是什么?是不是太hacky了?

【问题讨论】:

  • 有什么理由不简单地在实体上调用Update
  • 是的,这正是可能的问题,为什么不简单地调用更新?它是外部框架代码的片段。

标签: nhibernate data-access-layer


【解决方案1】:

Session.Evict 将从会话中逐出单个对象,例如,如果您在会话中已经有一个 obj,并且您尝试调用 session.Update(entity),您将收到一个异常,指出此 obj 已打开会话,您无法更新。

Session.Merge 会将单个对象与会话(缓存)上的现有对象合并并更新。

看看:https://stackoverflow.com/a/9161057/316799

【讨论】:

  • 但是为什么merge()?为什么不通过直接更新来跟踪驱逐?更新会将实体置于会话中吗?
  • 在 evict 之后直接更新仍然会抛出 NonUniqueObjectException。正如文档所说,传递的实例被删除,而不是具有标识符和类型的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 2012-03-24
  • 2020-01-20
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多