我在新项目中将 Entity Framework 4.1 与 POCO 实体一起使用。一切正常,直到我开始使用 AppFabric 缓存来缓存实体。我开始从与反序列化代理对象相关的缓存中检索实体时出错。我通过设置 ContextOptions.ProxyCreationEnabled = false 解决了这个问题。
现在的问题是当我从缓存中取回实体时,我必须使用 ObjectSet.Attach(entity) 将实体附加到当前上下文,并使用 ObjectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified) 将它们添加到状态管理器.
我的问题是有没有办法以编程方式启用/禁用一组实体的代理?或者换句话说,一种将反序列化实体包装在代理对象中的方法。
如果没有好的方法可以做到这一点,我现在的做法是否正确?或者,还有更好的方法?
最佳答案
您正在以正确的方式使用它。以编程方式启用或禁用代理创建的唯一方法是设置 ContextOptions.ProxyCreationEnabled
至 false
或 true
就像你现在所做的那样。
我认为没有办法将反序列化实体包装到代理对象中。问题是代理是从您的实体类型派生的动态创建的类型(= 在运行时创建的类型)。因此,如果您将其反序列化为您的实体类型,则无法将其转换为其他类型。
可能有效的是使用代理但禁用 LazyLoading
(也在 ContextOptions
中)并手动从加载它们的上下文中分离实体。但它会破坏所有关系,您仍然必须将实体附加到新上下文并设置其状态。另一个可行的解决方案是通过 context.CreateObject
创建新实体并将所有数据从缓存实体复制到新实体,但这是我不喜欢的解决方案。
换句话说:一旦您使用分离的实体,您必须手动处理附加和设置状态。如果您要去 change relations,情况会更糟.
顺便提一句。您提到使用 EFv4.1,但您使用的所有东西都是 EFv4。 EFv4.1 没有对 ObjectContext API 进行任何更改,它添加了不同的 DbContext API,因此除非您正在转换 DbContext
返回 ObjectContext
您正在使用 EFv4。如果你投 DbContext
返回 ObjectContext
那么你应该检查 DbContext API,因为它提供了等效的 Attach
或 ChangeObjectState
=> DbSet.Attach
安德context.Entry(entity).State
.
关于entity-framework - 以编程方式启用/禁用实体代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5719787/