使用 EF 8 核心。
我有一个目录系统。它包含页面。页面可以包含其他页面和项目。我需要递归加载子页面。
我有这个
var page = await dbContext
.Set<CatalogPage>()
.Where(x => x.Id == eventParser.PageId)
.Include(c => c.Items).ThenInclude(x => x.FurnitureItems)
.Include(c => c.Pages).ThenInclude(x => x.Pages)
.FirstOrDefaultAsync();
但它只加载一层深度。
这可以一直持续下去,直到属性
CatalogPageId
与页面不匹配(无父页面),或者在 EF 的情况下相反,因为它需要加载内部。
这是我的实体:
public class CatalogPage
{
[Key]
public int Id { get; init; }
public string? Name { get; init; }
public string? Caption { get; init; }
public string? Layout { get; init; }
public int? RoleId { get; init; }
public int CatalogPageId { get; init; }
public int OrderId { get; init; }
public int IconId { get; init; }
public ICollection<CatalogPage> Pages { get; init; } = [];
public ICollection<CatalogItem> Items { get; init; } = [];
}
AutoInclude
方法。 强制在实体的配置中自动包含集合。
例如,在你的entitytype配置Fluent类中:
builder.Navigation(x => x.Pages).AutoInclude()
这将导致属性始终被扩展,从而根据定义使其递归。
这种方法的警告是,当您不想想要包含这种关系时,您确实会失去对其他情况的一些控制。