【问题标题】:C# Clone System.Data.Entity.DynamicProxies to the actual (non proxied) class? [duplicate]C# 将 System.Data.Entity.DynamicProxies 克隆到实际(非代理)类? [复制]
【发布时间】:2011-10-05 05:46:43
【问题描述】:

可能重复:
EF4 Cast DynamicProxies to underlying object

我正在尝试弄清楚如何将 System.Data.Entity.DynamicProxies 克隆或转换为它的实际类。例如:

System.Data.Entity.DynamicProxies.Currency_F4008E27DE_etc is the proxy class
MyApp.Entities.Currency is the real class

MyApp.Entities 中的所有类都继承自 BaseEntity,所以我尝试在那里进行转换:

public abstract partial class BaseEntity
{
    public T ShallowCopy<T>() where T : BaseEntity
    {
        return this.MemberwiseClone() as T;
    }
    // other BaseEntity properties not relevent here
}

然后将 DynamicProxies 转换成真正的类:

// this returns a DynamicProxies class
Currency currency = LookupDefaultCurrency(); 
// this one needs to return a Entities.Currency class 
// (but currently returns a DynamicProxies class too
Currency pocoCurrency = (Currency)currency.ShallowCopy<Currency>();
HttpRuntime.Cache[key] = pocoCurrency;

这样做的原因是我想从此对象中删除所有实体框架跟踪等,并将其普通 (POCO) 属性存储在缓存中。而且我需要能够为所有 100 个左右的 Entity 类执行此操作,因此它必须是相当通用的 - 无需手动为每个属性指定 object1.foo = object2.foo。

【问题讨论】:

  • 为什么您没有按照上一个问题的要求关闭代理生成?
  • 原来这不是我需要的。在大多数情况下,我确实需要他们成为代理(具有所有跟踪等)。但是当缓存供以后只读使用时,它需要是一个非代理对象,请参阅stackoverflow.com/questions/6688772/…
  • 您可以有选择地为某些上下文实例甚至查询关闭代理创建,所以恕我直言,您应该可以只为加载您的货币而关闭代理。
  • 我正在使用存储库 - 服务模式,因此实际的对象上下文不可访问,它与调用 _service.Get() 的代码分开两层,后者调用 repository.Get() 调用objectcontext.asQueryable().Where(..etc..)
  • 在这种情况下你需要像GetUnproxied()这样的特殊方法。架构不应要求您如何检索数据。如果您需要特殊方法,只需将其公开即可。通用方法是童话故事。

标签: c# entity-framework poco dynamic-proxy cloning


【解决方案1】:

也许this article 会有所帮助。它讨论了几种克隆数据的方法。我不确定这些方法是否可以用于将 A 类型的对象转换为 B 类型的对象。但绝对值得一试。

我会对这个结果非常感兴趣,因为this NuGet package 也使用通用存储库模式和 memcached 来解决相同的缓存技术,并且在反序列化数据时您的问题似乎相同。

【讨论】:

  • @JK 你能提供哪种方法使它适合你,我很感兴趣,因为我的项目中有同样的问题。
猜你喜欢
  • 2015-12-22
  • 1970-01-01
  • 2021-04-29
  • 2012-01-16
  • 2015-03-27
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
相关资源
最近更新 更多