【问题标题】:Programmatically Enabling/Disabling Entity Proxies以编程方式启用/禁用实体代理
【发布时间】:2011-08-08 20:28:42
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您以正确的方式使用它。以编程方式启用或禁用代理创建的唯一方法是像现在一样将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 的等价物。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-04
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      相关资源
      最近更新 更多