实体框架核心递归自引用结果

时间:2020-08-27 11:20:40

标签: entity-framework-core eager-loading asp.net-core-3.1

我有一张这样的桌子

public class Asset
{

    public int id_asset { get; set; }
    public int id_user { get; set; }
    public int id_parent_asset { get; set; }
    public string name { get; set; }

    public virtual Asset Parent_Asset { get; set; }
    public virtual ICollection<Asset> Child_Assets { get; set; }
    public virtual User User { get; set; }
}

我想获得资产的所有子资产。我尝试了以下代码,

context.Asset.Where(o => o.name.Contains("Root")).Include(o => o.Child_Assets ).FirstOrDefault();

但是它仅包含一级子级。我需要获得所有级别。我不知道我应该获得多少个级别,所以我需要一个递归方法,或者也许已经有一个方法可以做到这一点。

有谁知道我该如何处理这个问题。

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并且能够使用延迟加载而不是急切加载来解决。那可能不适合您。

使用延迟加载,您无需指定在查询数据库时要加载的导航属性(无需.include调用)。 EF Core会在您访问相关实体时自动为其加载它们。也就是说,从上下文中获取根资产,它的子代将在那里。

要使用延迟加载,您需要添加Microsoft.EntityFrameworkCore.Proxies nuget程序包,然后在配置上下文时调用.UseLazyLoadingProxies()。有关详细信息,请参见文档https://docs.microsoft.com/en-us/ef/core/querying/related-data#lazy-loading

还请注意,要使魔术发生,加载实体的上下文需要了解相关实体(在您的情况下为子资产)。它将不会在数据库中查询子资产,但是如果它在内存中有它们将会链接它们。因此,在您的情况下,您将需要加载所有资产,然后获得根资产及其子代及其子代。

如果您使用多个上下文,则可能会遇到问题。假设资产被加载到一个上下文中,而用户被加载到另一个上下文中,在这种情况下为root。User将为null,因为用于加载根资产的上下文没有用户在内存中。