【问题标题】:What happens if I attach an entity which is already attached in EF? [closed]如果我附加一个已附加在 EF 中的实体会怎样? [关闭]
【发布时间】:2020-12-17 19:53:18
【问题描述】:

我在我写的缓存层中保存了一些EF entities。当我从缓存中检索它们时,有时会收到“contextObject is dispose”错误。从缓存中获取实体后,我想附加一个新的contextObject。这会导致什么副作用?如果我附加一个已经附加的实体会发生什么?性能?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    例外 "ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。"

    查看 Context.DbSet.Local() 方法以获取 Context 中的所有对象。

    【讨论】:

    • 如果实体已附加,我如何通过代码验证? if (maMDBEntities.Entry(group).State == EntityState.Detached)
    • 抱歉只对标题做出反应。我的错。您可以“tryGet”一个实体来尝试 dbset.Local.find 来设置它是否仍然可用
    • 这是否仍然发生在 EF 6.1 中?我的代码中没有看到这个异常。
    • Context.DbSet.Local() 在 EF7 中不存在,我如何在 EF7 中找到它们?
    【解决方案2】:

    像这样试试。

    ObjectStateEntry entry;
        if(context.ObjectStateManager.TryGetObjectStateEntry(entity, out entry)) {
            return (entry.State != EntityState.Detached);
        }
    

    也检查这个答案。 Entity Attached to a data context

    【讨论】:

    • 这和这个语法一样吗? if (maMDBEntities.Entry(group).State != EntityState.Detached)
    【解决方案3】:

    它会抛出一个异常(不确定是哪个),因为对象已经被附加了。

    只需在代码中尝试一下,尝试起来非常简单。它发生在我身上。

    顺便说一句,您应该在结束使用 contextobject 后立即处理它。如果不这样做,您会得到一些奇怪的行为(对象未更新,直接在 db 中修改的缓存对象不反映更改等)。

    问候。

    【讨论】:

    • 如果实体已附加,我如何通过代码验证? if (maMDBEntities.Entry(group).State == EntityState.Detached)
    • 如果你从 EF 得到一些对象,你已经附加了它。如果任何引用仍指向该对象,则它已附加。我会尝试不同的方法,而不仅仅是检查是否附加了对象......
    • 1) you should dispose your contextobject as soon as you end using it - 我愿意。这就是导致我的问题的原因,因为在 objectContext 被废弃后实体以缓存方式保存。
    • 2) If you get some object from EF, you're already attaching it - 我从缓存中得到它。这就是为什么我想将它重新附加到一些 objectContext
    • 3) would try a different approach, not just checking if object is attached - 你对我的缓存有什么建议 - 处理 objectContext 问题?
    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    相关资源
    最近更新 更多