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

时间:2020-10-16 16:33:24

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

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

System.InvalidOperationException:'无法在'User'上配置密钥,因为它是派生类型。必须在根类型“人”上配置密钥。如果您不打算将“ 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”,分别具有键,名称和“用户”,分别具有键,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();
    }
}

下面是DBContext代码

公共局部类DomainContext:DbContext { 公共虚拟DbSet人员{组; }

    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);
    }
}

创建DomainContext实例后

        var c = new Context.DomainContext();
        c.Database.EnsureCreated()

OnModelCreating方法被调用,并且出现以下异常。

enter image description here

我不确定这是怎么回事。以下是问题

  1. 我的意图是在enitybase中的所有表具有多个公共字段,我们可以在一个公共位置进行映射。
  2. 如果我们删除用户映射,则一切工作都很好,但是我不明白用户映射的原因和问题。

先谢谢了。

0 个答案:

没有答案