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

时间:2011-04-19 16:45:16

标签: 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)

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

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

1 个答案:

答案 0 :(得分:8)

您正在以正确的方式使用它。以编程方式启用或禁用代理创建的唯一方法是将ContextOptions.ProxyCreationEnabled设置为falsetrue,就像您现在一样。

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

可能有用的是使用代理但禁用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 ande context.Entry(entity).State