(代理)为什么在 Entity Framework 中使用延迟加载向下钻取层次结构会产生不同的行为?

(Proxy) Why does drilling down the hierachy with lazyloading in Entity Framework give different behavior?

需要澄清为什么 Entity Framework 在以下场景 A 和 B 中表现不同。

在这些场景中,上下文仍然存在,我们使用延迟加载和以下实体:

public class Root
{
    //... some Properties

    public virtual ICollection<Child> GoingDown { get; set; }
}

public class Child
{
    //... some Properties

    public virtual Root Root { get; set; }

    public virtual ICollection<DeeperChild> GoingDeeper { get; set; }

}

public class DeeperChild
{
    public virtual Child Child { get; set; }

    public virtual ICollection<MoreDeeperTypeWithVirtualStuff> GoingFurtherDown { get; set; }
}

场景A

Root root = Context.Roots.First();
Console.WriteLine(root.GoingDown.FirstOrDefault().GetType().ToString());
//Display System.Data.Entity.DynamicProxies.Child_[SomeGuid]

场景 B

Root root = Context.Roots.First(r => r.Id == SomeId);
Console.WriteLine(root.GoingDown.FirstOrDefault().GetType().ToString());
//Display MyNamespace.Child

由于 returned 类型不是“代理”类型,延迟加载在场景 B 中不再起作用。它不应该像场景 A 那样 return 代理类型吗?

编辑:

问题与上述情况无关
经过进一步的研究,不同的行为似乎与场景无关,而是获取了哪个根。在每种情况下,加载的根都是代理类型。当深入到 childs 时,child 的类型始终是代理,除了场景 B 的特定根实例。在代码的这一点上,该根可能在 EntityFramework' s 缓存,因为在该点之前该根被查询了两次(在另外两个 class 中)。这两个其他调用不获取 childs.

我做了新的测试
在根实例的第一次获取中,我添加了 childs 的虚拟使用,child 的类型是代理。然而,即使在第一次调用时使用虚拟使用,child 的类型在达到秒和三分之一获取时不再是代理。

我发现发生了什么,在第一次和第二次提取根之间执行了一些代码,刷新了所有子项并 rec创建了它们的全新实例。因此,childs 不再来自数据库,从而使它们不是 "proxy" 类型,从而使其无法使用延迟加载。