实体框架v4 POCO模板:存储库返回不正确类型的对象

时间:2011-01-23 17:08:35

标签: entity-framework entity-framework-4

我刚刚实现了基于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类。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我同意Mare的回答是正确的。但是,我要谨慎一点。 如果在没有将此ProxyCreationEnabled设置设置为true的情况下运行查询,则EF将返回DynamicProxies。如果随后运行设置为false的查询,则无论ProxyCreationEnabled设置如何,EF都将返回缓存的DynamicProxies对象。

答案 2 :(得分:0)

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

if (!loader.IsLazyLoadingEnabled(container))

...

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

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

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

ALT:它可以配置为Json serizialization: JSON.NET Error Self referencing loop detected for type