LazyLoading已关闭。使用.Include()时,子对象仍然以递归方式加载。

时间:2016-07-26 22:47:41

标签: c# entity-framework lazy-loading

在我们的网络应用中,我们使用了Facade模式。这使我们利用Automapper在对象层DAL< - >之间进行转换。 DTO< - >的ViewModels。

我禁用了LazyLoading,并且它已在大多数情况下生效。 但是,包含了一些嵌套对象,而没有在" .include"中明确添加它们。言。

实施例

public class Parent {
    public Guid? Child1Id{ get; set; }

    [ForeignKey("Child1Id")]
    public Child1 Child1 { get; set; }
}

public class Child1 {
    public Guid? Child2Id{ get; set; }

    [ForeignKey("Child2Id")]
    public Child2 Child2 { get; set; }
}

public class Child2 {
    public string Name { get; set; }
}

现在任何尝试检索Parent和Child1;也将返回Child2 如图所示:

var Parent = RepositoryReference.DbContext
                .Parents
                .Include(p => p.Child1);

钻入父对象时,如图所示检索Child2

Parent.Child1.Child2 != null

请注意Child2不是虚拟的。

我可以采取哪些进一步的操作来忽略我明确包含的对象的嵌套子元素?

由于

1 个答案:

答案 0 :(得分:0)

首先,请确保配置上下文以关闭延迟加载,如下所示:

public DbContext()
    : base("Name = ConntectionName")
{
    this.Configuration.ProxyCreationEnabled = false;
    this.Configuration.LazyLoadingEnabled = false;
}

正如@MahdiFarhani所说,另一个原因可能是您在同一范围内加载具有相同ID 的Child2 。想象一下以下场景:

var child2Id = ......;
Child2 child2 = RepositoryReference
    .DbContext
    .Child2s
    .FirstOrDefault(m => m.Id == child2Id);

Parent Parent = RepositoryReference
    .DbContext
    .Parents
    .Include(p => p.Child1);

如果 parent.Child1.Child2 在上述方案中等于 child2Id ,则它们会自动关联, parent.Child1.Child2 是不再是null。因此,如果您这样做,请确保在检索Child2时将parent.Child1.Child2显式设置为null或使用 AsNoTracking()

Child2 child2 = RepositoryReference
    .DbContext
    .Child2s
    .AsNoTracking() // Add this line to not keep Child2 in context
    .FirstOrDefault(m => m.Id == child2Id);