Entity framework core 实体框架核心3.1.9实体映射引发InvalidOperationException

Entity framework core 实体框架核心3.1.9实体映射引发InvalidOperationException,entity-framework-core,ef-core-3.1,Entity Framework Core,Ef Core 3.1,我在EF Core(3.1.9)中得到以下异常 System.InvalidOperationException:'无法在“用户”上配置密钥,因为它是派生类型。必须在根类型“Person”上配置密钥。如果您不打算将“Person”包含在模型中,请确保它未包含在您上下文中的DbSet属性中,未在对ModelBuilder的配置调用中引用,也未从模型中包含的类型的导航属性中引用。” 在这一行,我想映射实体的主键 我有下面的型号 public partial class EntityBase {

我在EF Core(3.1.9)中得到以下异常

System.InvalidOperationException:'无法在“用户”上配置密钥,因为它是派生类型。必须在根类型“Person”上配置密钥。如果您不打算将“Person”包含在模型中,请确保它未包含在您上下文中的DbSet属性中,未在对ModelBuilder的配置调用中引用,也未从模型中包含的类型的导航属性中引用。”

在这一行,我想映射实体的主键

我有下面的型号

public partial class EntityBase
{
    public virtual long? Id { get; set; }
}

public partial class Person : EntityBase
{
    public virtual string Name { get; set; }
}

public partial class User : Person
{
    public virtual string LoginName { get; set; }
}
现在我的意图是让两个表“People”分别以Key、Name和“Users”的Key、LoginName作为列

请找到相应的映射。为了实现可伸缩性和可扩展性,我使用了IEntityTypeConfiguration实现

public abstract class EntityBaseTypeConfiguration<T> : IEntityTypeConfiguration<T> where T : EntityBase
{
    protected abstract void ConfigureChild(EntityTypeBuilder<T> builder);

    public void Configure(EntityTypeBuilder<T> builder)
    {
        builder.HasKey(p => p.Id);
        ConfigureChild(builder);
    }
}

public class PersonTypeConfiguration<T> : EntityBaseTypeConfiguration<T> where T : Person
{
    protected override void ConfigureChild(EntityTypeBuilder<T> builder)
    {
        builder.ToTable("People");
        builder.Property(p => p.Name).HasMaxLength(50).IsRequired();
    }
}

public class UserTypeConfiguration<T> : PersonTypeConfiguration<T> where T : User
{
    protected override void ConfigureChild(EntityTypeBuilder<T> builder)
    {

        base.ConfigureChild(builder);
        builder.Property(p => p.LoginName).HasMaxLength(50).IsRequired();
    }
}
OnModelCreating方法被调用,我得到以下异常

我不确定这里出了什么问题。以下是问题

  • 我的意图是在enitybase中有所有表的多个公共字段,我们可以在一个公共位置进行映射
  • 如果我们删除了用户映射,那么一切都正常,但我不明白用户映射中的问题是什么
  • 提前谢谢

        public virtual DbSet<User> Users { get; set; }
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.EnableDetailedErrors(true);
            //optionsBuilder.UseLoggerFactory(new LoggerFactory());
            base.OnConfiguring(optionsBuilder);
            
        }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.ApplyConfiguration(new UserTypeConfiguration<User>());
            modelBuilder.ApplyConfiguration(new PersonTypeConfiguration<Person>());
           
            base.OnModelCreating(modelBuilder);
        }
    }
    
            var c = new Context.DomainContext();
            c.Database.EnsureCreated()