在以前使用旧版本的Entity Framework时,我习惯使用Eager Loading - 所以你得到你的root实体,然后根据使用“Include”收集相关实体。
在我目前的项目中,我们使用数据库优先在新数据库上实现了最新版本的EF。拿这门课,例如:
public partial class Zone
{
public Zone()
{
this.OverrideCharges = new HashSet<OverrideCharge>();
}
public System.Guid RowId { get; set; }
public string Name { get; set; }
public virtual ICollection<OverrideCharge> OverrideCharges { get; set; }
}
OverrideCharges对象下面还有许多子属性,其下有相关的实体。
我们有两个上下文,实际的DB上下文和一组DTO上下文。后者的对象大多是前者的副本 - Zone_dto对象几乎是原始对象的副本。在两者中,我使用:
关闭了延迟加载 public CContext(): base("BreezeMetaData")
{
this.Configuration.LazyLoadingEnabled = false;
}
public UDBEntities()
: base("name=UDBEntities")
{
this.Configuration.LazyLoadingEnabled = false;
}
现在,我通过这样做来查询我的Zone对象:
public List<Zone_dto> GetZones()
{
List<Zone> zones = _cilContext.Zones.ToList();
List<Zone_dto> zone_dtos = new List<Zone_dto>();
foreach (Zone zn in zones)
{
zone_dtos.Add(Mapper.Map<Zone, Zone_dto>(zn));
}
return zone_dtos;
}
所以 - 没有包括。并且禁用延迟加载。我希望能够找回Zone对象及其直接属性的列表,但不会找回任何相关实体。
但我得到的是Zone对象,加上所有的OverrideCharges,以及OverrideCharges等所有相关实体,一直到树下。
这些数据对象并不庞大,并不是一个大问题。但我很沮丧,我不明白为什么我要收回所有这些我没有要求过的数据。有人可以解释一下吗?
答案 0 :(得分:1)
你所描述的正是我所期待的 - 你似乎有懒惰和渴望加载倒退。
延迟加载意味着上下文不会加载所有内容 - 它是懒惰的,因为它的工作量较少,并且仅加载您要求的内容。当 延迟加载时需要.Include()
,因为你告诉它不对你Include()
的事物是懒惰的。
预先加载意味着上下文会在您提出要求之前加载您可能需要的所有内容,方法是跟踪您请求的项目中的链接并加载它们所导致的内容。关闭延迟加载后,不需要将其告知Include()
,因为默认情况下它会加载所有内容。 .Include()
的使用被称为急切加载,因为您告诉它使用该属性的预先加载行为;默认情况下,如果急切加载所有内容,则不需要.Include()
。
设置LazyLoadingEnabled = true;
,看看会发生什么。
答案 1 :(得分:0)
可能是因为虚拟关键字。虚拟ICollection将延迟加载。
请参阅此SO link。