EF Core 6 的多级属性

E.B*_*dos 10 c# entity-framework-core .net-6.0

从 .NET 5.0 升级到 .NET 6.0(包括作为实体框架的所有相关 Microsoft 库)后,我在使用 EF Core 对数据库上下文执行查询时开始收到此错误:

System.InvalidOperationException:警告“Microsoft.EntityFrameworkCore.Query.NavigationBaseIncludeIgnored”生成错误:导航“MarkersTranslation.Marker”在查询中被忽略,因为修复将自动填充它。如果之后在“包含”中指定了任何进一步的导航,那么它们将被忽略。不允许步行返回,包括树木。通过将事件 ID“CoreEventId.NavigationBaseIncludeIgnored”传递给“DbContext.OnConfiguring”或“AddDbContext”中的“ConfigureWarnings”方法,可以抑制或记录此异常。

这是有罪的代码:

Tour tour = await _context.Tours.Include(mpt => mpt.MarkersPerTours)
                                .ThenInclude(mrk => mrk.Marker)
                                .ThenInclude(mrkProp => mrkProp.MarkersTranslations)
                                .ThenInclude(mrk => mrk.Marker)
                                .ThenInclude(mrkTp => mrkTp.Type)
                                .FirstOrDefaultAsync(t => t.Id == tourId);
Run Code Online (Sandbox Code Playgroud)

因此,每个实体都有一组与其翻译Tour相关的集合,但每个实体也都有一个.MarkerMarkerType

Microsoft Docs似乎批准了我用于此查询的模式,以便包含多个级别。

现在使用 EF Core 6 获得相同结果的正确方法是什么?

Ger*_*old 9

有趣的是,“不允许返回包含树”这一限制并不在 EF core 6 的重大更改列表中。

在仅向前移动树的情况下包含您想要的所有内容的方法是:

Tour tour = await _context.Tours
    .Include(tour => tour.MarkersPerTours)
        .ThenInclude(mpt => mpt.Marker)
            .ThenInclude(mrk => mrk.MarkersTranslations)
    .Include(tour => tour.MarkersPerTours)
        .ThenInclude(mpt => mpt.Marker)
            .ThenInclude(mrk => mrk.Type)
    .FirstOrDefaultAsync(t => t.Id == tourId);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我更改了范围变量的名称,在我看来,它更清晰、更传统,让名称反映它们的类型,而不是它们要导航到的属性。

  • 你是对的,它不包含在重大更改文档中。因此,我在 Microsoft Docs 存储库上提出了一个问题 (https://github.com/dotnet/EntityFramework.Docs/issues/3653)。我同意你关于需要反映类型的名称的看法。 (2认同)

Lax*_*lak 7

配置警告以忽略它,如下所示

services.AddDbContext<YourContext>(options =>
        {
          
            options.ConfigureWarnings(warnings =>
                
            warnings.Ignore(CoreEventId.NavigationBaseIncludeIgnored));
        });
Run Code Online (Sandbox Code Playgroud)

或者你可以在Dbcontext的OnConfiguring方法中添加类似的东西

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
        .ConfigureWarnings(warnings => warnings.Ignore(CoreEventId.NavigationBaseIncludeIgnored, CoreEventId.NavigationBaseIncluded));
Run Code Online (Sandbox Code Playgroud)