entity-framework - 以编程方式启用/禁用实体代理

标签 entity-framework entity-framework-4 entity poco

我在新项目中将 Entity Framework 4.1 与 POCO 实体一起使用。一切正常,直到我开始使用 AppFabric 缓存来缓存实体。我开始从与反序列化代理对象相关的缓存中检索实体时出错。我通过设置 ContextOptions.ProxyCreationEnabled = false 解决了这个问题。
现在的问题是当我从缓存中取回实体时,我必须使用 ObjectSet.Attach(entity) 将实体附加到当前上下文,并使用 ObjectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified) 将它们添加到状态管理器.

我的问题是有没有办法以编程方式启用/禁用一组实体的代理?或者换句话说,一种将反序列化实体包装在代理对象中的方法。

如果没有好的方法可以做到这一点,我现在的做法是否正确?或者,还有更好的方法?

最佳答案

您正在以正确的方式使用它。以编程方式启用或禁用代理创建的唯一方法是设置 ContextOptions.ProxyCreationEnabledfalsetrue就像你现在所做的那样。

我认为没有办法将反序列化实体包装到代理对象中。问题是代理是从您的实体类型派生的动态创建的类型(= 在运行时创建的类型)。因此,如果您将其反序列化为您的实体类型,则无法将其转换为其他类型。

可能有效的是使用代理但禁用 LazyLoading (也在 ContextOptions 中)并手动从加载它们的上下文中分离实体。但它会破坏所有关系,您仍然必须将实体附加到新上下文并设置其状态。另一个可行的解决方案是通过 context.CreateObject 创建新实体并将所有数据从缓存实体复制到新实体,但这是我不喜欢的解决方案。

换句话说:一旦您使用分离的实体,您必须手动处理附加和设置状态。如果您要去 change relations,情况会更糟.

顺便提一句。您提到使用 EFv4.1,但您使用的所有东西都是 EFv4。 EFv4.1 没有对 ObjectContext API 进行任何更改,它添加了不同的 DbContext API,因此除非您正在转换 DbContext返回 ObjectContext您正在使用 EFv4。如果你投 DbContext返回 ObjectContext那么你应该检查 DbContext API,因为它提供了等效的 AttachChangeObjectState => DbSet.Attach安德context.Entry(entity).State .

关于entity-framework - 以编程方式启用/禁用实体代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5719787/

相关文章:

entity-framework - 何时在 Entity Framework 上使用 t-SQL

encoding - é == ‘ “é,但是基于什么编码/引用?

JPA 错误 : The entity has no primary key attribute defined

java - 我们可以将实体转换为 dto/pojo 对象吗?

c# - 如何检查查询是否通过网络执行?

c# - 脚手架 EntityFramework 6 无法将类型为 'System.Data.Entity.Core.Objects.ObjectContext' 的对象转换为 'System.Data.Objects.ObjectContext'

entity-framework-4 - 使用 Guid 作为 EF4 Code First 的 PK

c# - Code First 类型 '' 上的属性 '' 上的ForeignKeyAttribute 无效。 Entity Framework

entity-framework - Entity Framework 迁移停止检测POCO更新

entity-framework-4 - 不同的EF 4 SaveOptions对ObjectContext有什么影响?