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