【问题标题】:EF Core Include navigation property on abstract derived classEF Core 包含抽象派生类上的导航属性
【发布时间】:2021-09-07 01:57:55
【问题描述】:

我在尝试包含派生类型的导航属性时抛出以下异常:

System.InvalidOperationException: Invalid include.
   at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.PopulateIncludeTree(IncludeTreeNode includeTreeNode, Expression expression)
   at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.ProcessInclude(NavigationExpansionExpression source, Expression expression, Boolean thenInclude)
   at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   ...

使用以下简化的类结构:

public abstract class BaseJob
{
  public int Id { get; set; }
}
public abstract class WorkerJob : BaseJob
{
  public Person Person { get; set; }
}
public class PaintingJob : WorkerJob
{
  public string Color { get; set; }
}
public class Person {
  public int Id { get; set; }
  public string Name { get; set; }
}

当通过DbContext 查询时,记录在here

// Throws InvalidOperationException
var jobs = await _context.BaseJobs
  .Include(job => (job as WorkerJob).Person) // WorkerJob is abstract
  .ToListAsync();

这必须与抽象类中存在的导航属性相关,因为要按预期将查询调整为以下工作:

// Works as intended
var jobs = await _context.BaseJobs
  .Include(job => (job as PaintingJob).Person) // PaintingJob is concrete
  .ToListAsync();

但是,我有许多具体派生类,我不想每次添加新的具体类时都必须更改查询。这可能是 EF Core 的错误,还是我做错了什么?

【问题讨论】:

    标签: c# entity-framework entity-framework-core ef-core-3.1


    【解决方案1】:

    绝对不是错误,错误是我的。我错误地配置了上下文如下:

    modelBuilder.Entity<PaintingJob>(entity =>
      {
        entity.HasBaseType<WorkerJob>();
        entity.HasOne(x => x.Person)
          .WithMany()
          .HasForeignKey(x => x.PersonId);
      });
    

    在定义导航属性时将其更改为使用抽象类可解决引发的异常并按预期返回结果。

    modelBuilder.Entity<WorkerJob>(entity =>
      {
        entity.HasBaseType<BaseJob>();
        entity.HasOne(x => x.Person)
          .WithMany()
          .HasForeignKey(x => x.PersonId);
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-16
      • 2020-05-23
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      相关资源
      最近更新 更多