sql >> Base de Datos >  >> RDS >> Sqlserver

Entity Framework Core 2.0:cómo configurar una clase base abstracta una vez

Si entiendo correctamente, el Status es solo una clase base y no una entidad base participando en la herencia de la base de datos.

En tal caso, es importante no referirse nunca a Status class directamente dentro del modelo de entidad y la configuración, es decir, sin DbSet<Status> , sin propiedades de navegación de tipo Status o ICollection<Status> , sin modelBuilder.Entity<Status>() llamadas y no IEntityTypeConfiguration<Status> .

En su lugar, siempre debe hacer referencia a los tipos concretos heredados del Status . Para reutilizar el código de configuración, debe usar genérico restringido métodos o clases y pasar los tipos de entidades concretas.

Dado que está utilizando IEntityTypeConfiguration clases, probablemente lo más natural es hacer su StatusConfiguration clase genérica:

public class StatusConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
    where TEntity : Status
{
    public virtual void Configure(EntityTypeBuilder<TEntity> builder)
    {
        builder.Property(c => c.updateUserName).IsRequired().HasMaxLength(50);
    }
}

y dejar que las clases de configuración de entidades derivadas se deriven de él:

public class ItemConfiguration : StatusConfiguration<Item>
{
    public override void Configure(EntityTypeBuilder<Item> builder)
    {
        base.Configure(builder); // <--
        builder.ToTable("Item", "dbo").HasKey(c => c.Id);
        builder.Property(c => c.Description).IsRequired().HasMaxLength(100);
    }
}