EF核心实现了具有抽象基类的流畅映射的每个具体类型的表



假设您有两个从抽象基类派生的实体,并且您想要实现每个具体类型的表。以下实体:

public abstract class EntityBase
{
   public int Id { get; set; }
   public string CreatedBy { get; set; }
   public DateTime CreatedAt { get; set; }
}
public class Person : EntityBase
{
   public string Name { get; set; }
}
public class PersonStatus : EntityBase
{
   public string Title { get; set; }
}

并且您不想在抽象基类(EntityBase)中使用属性,您只想在dbcontext中为所有实体映射EntityBase类一次。如何更改以下代码:

public class PeopleDbContext : DbContext
{
   public DbSet<Person> People { get; set; }
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
      base.OnModelCreating(modelBuilder);
      // Entity base class mapping(only once)
      modelBuilder.Entity<Person>(e =>
      {
        e.Property(x => x.Name)
            .IsRequired()
            .HasMaxLength(100);
      });
      modelBuilder.Entity<PersonStatus>(e =>
      {
        e.Property(x => x.Title)
            .IsRequired()
            .HasMaxLength(100);
      });
  }
}

以下是您的问题的答案。。

您需要为BaseClass:编写配置

public class EntityBaseConfiguration<TBase> : IEntityTypeConfiguration<TBase>
    where TBase : EntityBase
{
    public virtual void Configure(EntityTypeBuilder<TBase> builder)
    {
        builder.HasKey(b => b.Id);
        builder.Property(b => b.CreatedBy)
            .HasColumnType("varchar(50)");
        builder.Property(b => b.CreatedAt)
            .HasColumnType("datetime2");
    }
}

之后,您可以为继承自EntityBase的每个表编写具体的配置类,如下所示:

public class PersonConfig : BaseConfig<Person>
{
    public override void Configure(EntityTypeBuilder<Person> builder)
    {
        base.Configure(builder);
        builder.Property(e => e.Name)
            .HasColumnType("varchar(100)")
            .IsRequired();
    }
}

要在dbContext中调用配置,可以调用ApplyConfiguration:

public class PeopleDbContext : DbContext
{
    public DbSet<Person> People { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new PersonConfig());
    }
}

最新更新