【发布时间】:2020-12-17 19:53:18
【问题描述】:
我在我写的缓存层中保存了一些EF entities。当我从缓存中检索它们时,有时会收到“contextObject is dispose”错误。从缓存中获取实体后,我想附加一个新的contextObject。这会导致什么副作用?如果我附加一个已经附加的实体会发生什么?性能?
【问题讨论】:
标签: c# entity-framework
我在我写的缓存层中保存了一些EF entities。当我从缓存中检索它们时,有时会收到“contextObject is dispose”错误。从缓存中获取实体后,我想附加一个新的contextObject。这会导致什么副作用?如果我附加一个已经附加的实体会发生什么?性能?
【问题讨论】:
标签: c# entity-framework
例外 "ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。"
查看 Context.DbSet.Local() 方法以获取 Context 中的所有对象。
【讨论】:
if (maMDBEntities.Entry(group).State == EntityState.Detached)
Context.DbSet.Local() 在 EF7 中不存在,我如何在 EF7 中找到它们?
像这样试试。
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)
它会抛出一个异常(不确定是哪个),因为对象已经被附加了。
只需在代码中尝试一下,尝试起来非常简单。它发生在我身上。
顺便说一句,您应该在结束使用 contextobject 后立即处理它。如果不这样做,您会得到一些奇怪的行为(对象未更新,直接在 db 中修改的缓存对象不反映更改等)。
问候。
【讨论】:
if (maMDBEntities.Entry(group).State == EntityState.Detached)
you should dispose your contextobject as soon as you end using it - 我愿意。这就是导致我的问题的原因,因为在 objectContext 被废弃后实体以缓存方式保存。
If you get some object from EF, you're already attaching it - 我从缓存中得到它。这就是为什么我想将它重新附加到一些 objectContext
would try a different approach, not just checking if object is attached - 你对我的缓存有什么建议 - 处理 objectContext 问题?