Entity Framework Core 6 eager loading 包含太多关卡

Entity Framework Core 6 eager loading include too many level

将我的项目升级到 EF Core 6 后,我有一个奇怪的行为:

我的 dbcontext 中有两个 类 具有多对多关系 - 如下所示:

public class SiteImage
{
    public int siteImageId { get; set; }
    public string siteImageUrl { get; set; }
        ...
    public ICollection<SiteImageCategory> categories { get; set; }
}

public class SiteImageCategory
{
    public int siteImageCategoryId { get; set; }
    public string name { get; set; }
    public ICollection<SiteImage> images { get; set; }
}

它们映射到 DBContext 中的表

public DbSet<SiteImage> images { get; set; }
public DbSet<SiteImageCategory> categories { get; set; }

如果我想使用此代码检索所有图像:

var images = await _context.images.ToListAsync();

我已经得到所有类别为 null 的图像列表,这正是我所期望的。

但是如果我想使用预先加载来包含类别,就像这样:

var images = await _context.images
                           .Include(x => x.categories)
                           .ToListAsync();

我得到了包含类别的列表,但任何类别都包含所有相关图像,相关类别处于无限循环中(由 ReferenceHandler.IgnoreCycles 设置停止)。

根据 include 语句,我希望代码在类别级​​别停止。

我做错了什么?

谢谢

I would have expected to stop at the category level, according to include stantment.

确实如此。但是,当加载每个 SiteImageCategory 时,如果它的 SiteImage 已经在更改跟踪器中,则关系将被“修复”。因此,如果您加载 所有 SiteImages,您将在 Change Tracker 中拥有每个 SiteImageCategory 的 SiteImages,并且将填充反向导航 属性 集合。

ReferenceHandler.IgnoreCycles

这与 EF 无关,也与它做错了什么无关。您正在序列化您的数据库实体图,您应该避免这样做,因为它是一个双向链接图。

图像 X 有类别 Y、Z 等,这些类别有图像,其中之一是图像 X,它 ..

有类别 Y、Z 等,这些类别有图像,其中之一是图像 X,它 ..

有类别 Y、Z 等,这些类别有图像,其中之一是图像 X,它 ..

有类别 Y、Z 等,这些类别有图像,其中之一是图像 X,它 ..

以此类推

当序列化器序列化图形时,它将遍历这些路径并进入一个循环,只有在它能够跟踪它之前看到的所有内容时才会停止

如果您不想依赖它,还有其他选择:

  • 断开反向关系 - 清空每个类别中的所有 .Images 集合。这意味着您可以从图像开始并前往一个类别,但没有任何类别会链接回图像
  • 根本不要序列化数据库实体图;将其映射到没有循环的(一组)视图模型(图像视图模型可能 has-some 类别视图模型,但类别视图模型没有 has-a/some 图像视图模型)

我认为采用后一种方法可能是最常见的,并且不序列化数据库实体