EF Core 无法确定抽象的外键表示的关系 class

EF Core unable to determine relationship represented by foreign keys in abstract class

我正在尝试为包含两个对用户 class 的引用的 CRUD 对象实现抽象 class;一个用于创建对象的用户,另一个用于最后修改它的用户。 Entity framework 无法确定继承它们(部门)的 class 上的 CreatedBy 和 ModifiedBy 导航属性所表示的关系。一个潜在的额外并发症是用户 class 也有一个 属性 的 class 部门,这与部门的 CreatedBy 和 ModifiedBy 属性无关。

错误信息如下:

无法确定类型 'User' 的导航 属性 'Department.CreatedBy' 表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用 'OnModelCreating'.

中的 'EntityTypeBuilder.Ignore' 忽略此 属性

我正在使用 dotnet 3.0 和 EF Core 3.0

我尝试了 ForeignKey 数据属性的各种配置,并按照 EF 文档使用 Fluent API,但我无法让它们工作。

public class User
{
    [Key]
    public int Id { get; set; }
    public Department Department { get; set; } = null!;
}

public class Department : AbstractCrudObject
{

}

public abstract class AbstractCrudObject
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("CreatedByUserId")]
    public User CreatedBy { get; set; } = null!;
    public int CreatedByUserId { get; set; }

    [ForeignKey("ModifiedByUserId")]
    public User ModifiedBy { get; set; } = null!;
    public int ModifiedByUserId { get; set; }
}


public class AppDbContext : DbContext
{
    public virtual DbSet<User> Users { get; set; } = null!;
    public virtual DbSet<Department> Departments { get; set; } = null!;
    public AppDbContext()
    {
    }

    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    }
}

A potential additional complication is that the User class also has a property of class Department, which is unrelated to the CreatedBy and ModifiedBy properties on Department.

这就是问题所在 - EF Core 不知道它们是不相关的,还是与其中之一(以及哪一个)相关,因此您必须使用流畅的 API 显式配置它。

最低限度是指定所需关系的多重性和导航属性 - 在这种情况下,3 个多对一关系在依赖端具有参考导航 属性 并且没有集合导航 属性 在主体端:

modelBuilder.Entity<User>()
    .HasOne(e => e.Department)
    .WithMany();

modelBuilder.Entity<Department>()
    .HasOne(e => e.CreatedBy)
    .WithMany();

modelBuilder.Entity<Department>()
    .HasOne(e => e.ModifiedBy)
    .WithMany();