【问题标题】:Entity Framework v4 POCO templates: repository returns object of incorrect typeEntity Framework v4 POCO 模板:存储库返回不正确类型的对象
【发布时间】:2011-01-23 17:08:34
【问题描述】:

我刚刚实现了一个基于 EFv4 POCO 实体模板的存储库。

当我这样做时

public Client Load(Guid firmId,
                   int prettyId)
{
    var client = (from c in _ctx.Clients where c.firm_id == firmId && c.PrettyId == prettyId select c).FirstOrDefault();
    return client;
}

返回的客户端是类型

{System.Data.Entity.DynamicProxies.Client_8E92CA62619EB03F03DF1A1FC60C5B21F87ECC5D85B65759DB3A3949B8A606D3}

这里发生了什么?我想我会摆脱对 System.Data.Entity 命名空间中的类型的任何引用。返回的实例应该是Client类型,是一个简单的POCO类。

【问题讨论】:

  • 显然它与 ContextOptions.ProxyCreationEnabled 属性有关,如果我们将其设置为 false(默认为 true),它将不会创建代理对象(那些是 DynamicProxies 类型的对象)。但是我们也失去了延迟加载的能力。如果有人对此主题有更多见解,请回复。
  • 动态代理也支持更改跟踪功能。
  • 您确定禁用代理对象时会丢失延迟加载吗?我以前没有听说过这个问题......(然后我再次禁用延迟加载并急切加载我想要的)
  • 是的,我经历过。第二次我禁用了 ProxyCreationEnabled,我的对象中缺少引用的实体。这也是我对这篇文章的理解msdn.microsoft.com/en-us/library/dd456853.aspx

标签: entity-framework entity-framework-4


【解决方案1】:

我可以确认解决方法是设置

context.ProxyCreationEnabled = false;

这会禁用动态代理类型对象的创建,并为我们留下简单的 POCO,这就是我们最初使用 EF POCO 模板所追求的。

但是您会丢失导航属性的延迟加载和实体的更改跟踪。首先,您必须在 ObjectQuery 对象上使用 context.LoadProperty()Include() 方法。其次,我还不知道解决方案(实际上对 POCO 进行更改跟踪并没有什么意义)。

还有一个类似的问题我想指出 What are the downsides to turning off ProxyCreationEnabled for CTP5 of EF code first

【讨论】:

【解决方案2】:

我同意马雷的回答是正确的。但是,我要补充一点警告。 如果您在未将此 ProxyCreationEnabled 设置设置为 true 的情况下运行查询,则 EF 将返回 DynamicProxies。如果您随后运行设置为 false 的查询,则 EF 将返回缓存的 DynamicProxies 对象,而不考虑 ProxyCreationEnabled 设置。

【讨论】:

    【解决方案3】:

    这可以在 *Model.edmx 下的 *Model.Context.tt 文件中为 EF 上下文全局配置

    if (!loader.IsLazyLoadingEnabled(container))
    

    ...

        this.Configuration.LazyLoadingEnabled = false;
        this.Configuration.ProxyCreationEnabled = false;
    

    这些将被添加到 *Model.context.cs 生成的文件中,并将在来自数据库的更新之间持续存在。

    我更喜欢这个设置,因为我不想要一个与从数据库加载的父对象匹配的子对象。

    ALT:可以配置Json序列化: JSON.NET Error Self referencing loop detected for type

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2011-03-24
      • 2012-11-08
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多