Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Entity Framework Core 2.0:Einmaliges Konfigurieren der abstrakten Basisklasse

Wenn ich das richtig verstehe, der Status ist nur eine Basisklasse und keine Basis-Entität Teilnahme an der Datenbankvererbung.

In einem solchen Fall ist es wichtig, sich niemals auf Status zu beziehen Klasse direkt innerhalb des Entitätsmodells und der Konfiguration, d. h. kein DbSet<Status> , keine Navigationseigenschaften vom Typ Status oder ICollection<Status> , kein modelBuilder.Entity<Status>() Aufrufe und kein IEntityTypeConfiguration<Status> .

Stattdessen müssen Sie immer auf die konkreten Typen verweisen, die vom Status erben . Um Konfigurationscode wiederzuverwenden, sollten Sie eingeschränktes generisches verwenden Methoden oder Klassen und übergeben die konkreten Entitätstypen.

Da Sie IEntityTypeConfiguration verwenden Klassen ist es wahrscheinlich am natürlichsten, Ihre StatusConfiguration zu erstellen Klasse generisch:

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

und davon abgeleitete Entitätskonfigurationsklassen ableiten lassen:

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