LazyLoading已关闭.使用.Include()时仍递归加载子对象

本文关键字:递归 加载 对象 使用 Include LazyLoading | 更新日期: 2023-09-27 17:58:40

在我们的web应用程序中,我们使用的是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不是虚拟的。

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

感谢

LazyLoading已关闭.使用.Include()时仍递归加载子对象

首先,请确保配置您的上下文以关闭懒惰加载,如下所示:

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.Child2.Child2不再为空。所以,如果这对您来说是真的,请确保显式设置parent。Child1.Child2为null或在检索Child2:时使用AsNoTracking()

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