0

在以前使用旧版本的实体框架的努力中,我习惯于使用急切加载 - 所以你得到你的根实体,然后根据使用“包含”的要求收集相关实体。

在我当前的项目中,我们使用数据库优先在新数据库上实现了最新版本的 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 相关的实体等等,一直沿树向下。

这些数据对象并不庞大,也不是什么大问题。但是我很沮丧,因为我不明白为什么要取回我没有要求的所有数据。有人可以解释吗?

4

2 回答 2

1

你所描述的正是我所期望的——你似乎有延迟加载和急切加载。

延迟加载意味着上下文不会加载所有内容 - 它是延迟的,因为它所做的工作较少,并且只加载您特别要求的内容。.Include()当有延迟加载时需要,因为你告诉它不要对你正在做的事情感到懒惰Include()

急切加载意味着上下文将在您请求之前加载您可能需要的所有内容,方法是点击您请求的项目中的链接并加载它们导致的任何内容。关闭延迟加载后,不需要告诉它,Include()因为它会默认加载所有内容。的使用.Include()被称为急切加载,因为您告诉它对该属性使用急切加载行为;默认情况下急切加载所有内容,您不需要.Include().

设置LazyLoadingEnabled = true;并看看会发生什么。

于 2013-08-06T10:50:18.260 回答
0

可能是因为 virtual 关键字。虚拟 ICollection 将被延迟加载。

请参阅此 SO链接

于 2013-08-06T10:14:08.490 回答