递归包含 EF?

问题描述 投票:0回答:1

使用 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; } = [];
}
c# entity-framework
1个回答
0
投票

实现您所需的一种方法是使用

AutoInclude
方法

强制在实体的配置中自动包含集合。

例如,在你的entitytype配置Fluent类中:

builder.Navigation(x => x.Pages).AutoInclude()

这将导致属性始终被扩展,从而根据定义使其递归。

这种方法的警告是,当您不想想要包含这种关系时,您确实会失去对其他情况的一些控制。

© www.soinside.com 2019 - 2024. All rights reserved.