我在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方法被调用,并且出现以下异常。
我不确定这是怎么回事。以下是问题
先谢谢了。