Supponiamo di avere due entità derivate da una classe base astratta e di voler implementare il tipo Tabella-Per-Calcestruzzo. Entità come di seguito:
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; }
}
E tu non vuoi usare l'attributo nella classe base astratta (EntityBase), vuoi mappare la classe EntityBase in dbcontext solo una volta per tutte le entità. Come cambiare il codice qui sotto:
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);
});
}
}
Ecco una risposta alla tua domanda ..
Devi scrivere le configurazioni per il tuo 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");
}
}
Dopodiché, puoi scrivere la tua foreach Table di ConfigurationGlass che eredita da EntityBase in questo modo:
public class PersonConfig : BaseConfig<Person>
{
public override void Configure(EntityTypeBuilder<Person> builder)
{
base.Configure(builder);
builder.Property(e => e.Name)
.HasColumnType("varchar(100)")
.IsRequired();
}
}
Per richiamare la configurazione nel tuo dbContext puoi chiamare ApplyConfiguration:
public class PeopleDbContext : DbContext
{
public DbSet<Person> People { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new PersonConfig());
}
}