这是我的POCO实体场景:
Manufacturer
(1)有Cars
(*)
一个Car
实体具有Manufacturer
实体的导航属性。
一个Manufacturer
实体具有Cars集合的导航属性
我需要查询指定颜色的所有Cars
及其各自的Manufacturer
,因此我的EF查询将是:
Context.Cars.Where(i=>i.Color=='White').Include("Manufacturer").ToList();
这就是我得到的:
Cars
列表,其中Manufacturer
已正确填充
问题是Manufacturer
实体也会为其填充导航属性Cars
:
Cars.FirstOrDefault().Manutefacturer.Cars
装满了汽车......
我如何摆脱这种不良行为?
非常感谢。
更新#1: 我确实设置了以下属性:
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
答案 0 :(得分:1)
问题是制造商实体带来了导航 物业汽车也填充:
Cars.FirstOrDefault().Manufacturer.Cars
装满了汽车....
是的,但只有白色车......
数据库查询中没有额外的连接要求每个已加载的制造商的Cars
集合。但只是您在查询中加载的汽车 - 白色汽车 - 被添加到各自制造商的集合中。当加载的数据实现为实体时,实体框架上下文执行此操作。它被称为 relationship fixup ,您无法禁用它。 Here最近也是一个类似的问题和答案。
答案 1 :(得分:0)
听起来您可能启用了延迟加载,这会在第一次访问时自动从数据库加载导航属性。
您可以在构造函数中为整个DbSet
禁用它:
public MyContext() : base()
{
this.Configuration.LazyLoadingEnabled = false;
}
然后,只会出现使用Include()
手动加载的导航属性。
也就是说,如果你正在访问Cars
属性,那么想要填充它,不是吗?如果您没有访问它,那么首先不会发生延迟加载。