我遇到了一个非常特殊的问题:ToList()
扩展方法无法将结果转换为列表。这是我的代码,标准样板linq查询,我转换ToList()
两次以获得良好的衡量标准
var assets = new List<Asset>();
using (var ctx = new LeaseContext())
{
assets = ctx.Assets.OrderBy(o => o.Reference).Where(w => w.Status == AssetStatus.Active).ToList();
assets.ToList();
}
return assets;
但资产仍然是System.Data.Entities.DynamicProxies
....
我之前从未遇到过这个问题。
答案 0 :(得分:8)
原因是延迟加载。在EF中启用延迟加载(默认情况下),然后(再次,默认情况下),EF为每个实体创建动态代理。它是加载相关实体所必需的。动态代理将从实体类继承。因此,在您的情况下,它将继承自Asset
。但是动态代理将引用创建其实例的上下文。它将覆盖通过存储在动态代理中的上下文查询实体的导航属性(它们是虚拟的)。
将派生类型的实例添加到基类型列表中是完全合法的。
如果您不想要动态代理,那么只需禁用延迟加载和代理创建:
ctx.Configuration.LazyLoadingEnabled = false; // turn-off loading on-demand
ctx.Configuration.ProxyCreationEnabled = false; // turn-off wrapper class generation
从技术上讲,您可以关闭代理生成,延迟加载将无法正常工作。但我更愿意明确地关闭这两个设置。