【发布时间】:2013-08-07 06:46:00
【问题描述】:
在之前使用旧版本实体框架的工作中,我习惯于使用 Eager Loading - 因此您可以获取根实体,然后根据使用“包含”的要求收集相关实体。
在我当前的项目中,我们使用数据库优先在新数据库上实现了最新版本的 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 相关的实体等等,一直沿树向下。
这些数据对象并不庞大,也不是什么大问题。但是我很沮丧,因为我不明白为什么要取回我没有要求的所有数据。谁能解释一下?
【问题讨论】:
-
您是在上下文的整个生命周期内关闭 LazyLoading,还是仅仅为了这个操作?您的上下文可能在此操作之前加载了数据,通过生成该列表,您将看到所有内容(因为加载是在您关闭延迟加载之前完成的)。
-
它在构造函数中被禁用 - 查看编辑
标签: entity-framework