Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Entity Framework Core 2.0:come configurare la classe base astratta una volta

Se ho capito bene, lo Status è solo una classe base e non un'entità di base partecipare all'ereditarietà del database.

In tal caso è importante non fare mai riferimento a Status classe direttamente all'interno del modello di entità e della configurazione, ovvero no DbSet<Status> , nessuna proprietà di navigazione di tipo Status o ICollection<Status> , no modelBuilder.Entity<Status>() chiamate e nessun IEntityTypeConfiguration<Status> .

Invece, devi sempre fare riferimento ai tipi concreti che ereditano dallo Status . Per riutilizzare il codice di configurazione, dovresti utilizzare generico vincolato metodi o classi e passare i tipi di entità concrete.

Poiché stai usando IEntityTypeConfiguration classi, probabilmente la cosa più naturale è creare la tua StatusConfiguration classe generica:

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

e lascia che le classi di configurazione dell'entità derivata ne derivi:

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);
    }
}