Entity framework core 实体框架核心3.1.9实体映射引发InvalidOperationException
我在EF Core(3.1.9)中得到以下异常 System.InvalidOperationException:'无法在“用户”上配置密钥,因为它是派生类型。必须在根类型“Person”上配置密钥。如果您不打算将“Person”包含在模型中,请确保它未包含在您上下文中的DbSet属性中,未在对ModelBuilder的配置调用中引用,也未从模型中包含的类型的导航属性中引用。” 在这一行,我想映射实体的主键 我有下面的型号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 {
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方法被调用,我得到以下异常
我不确定这里出了什么问题。以下是问题
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()