Übersichtliche Konfiguration in Entity Framework Core mit IEntityTypeConfiguration<T>

Der Dotnet-Doktor  –  6 Kommentare

Entity Framework Core 2.0 bietet nun die Schnittstelle IEntityTypeConfiguration<T>, mit der man eine getrennte Konfigurationsklasse für einen einzelnen Entitätstyp implementieren kann.

Bei größeren Objektmodell kann die Fluent-API-Konfiguration in der Methode OnModelCreating() in der Entity-Framework-Core-Kontextklasse sehr schnell sehr umfangreich werden. Vor Entity Framework Core 2.0 (erschienen am 14.08.2017) konnte man die Klasse OnModelCreating() durch Unterroutinen zerlegen.

Mit Entity Framework Core 2.0 hat Microsoft eine weitere Strukturierungsmöglichkeit eingeführt: In Anlehnung an die Auslagerung der Konfiguration in von EntityTypeConfiguration<T> erbenden Klassen, die es im klassischen Entity Framework gibt, bietet Entity Framework Core nun die Schnittstelle IEntityTypeConfiguration<Entitätstyp>, mit der man eine getrennte Konfigurationsklasse für einen Entitätstyp implementieren kann.

using GO;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace EFC_Kontext
{
/// <summary>
/// Konfigurationsklasse für Entitätsklasse Flug
/// Möglich ab EFCore 2.0
/// </summary>
class FlugETC : IEntityTypeConfiguration<Flug>
{
public void Configure(EntityTypeBuilder<Flug> f)
{
// ----------- Schlüssel
f.HasKey(x => x.FlugNr);
f.Property(x => x.FlugNr).ValueGeneratedNever();
// ----------- Längen und Null-Werte
f.Property(x => x.Memo).HasMaxLength(5000);
f.Property(x => x.Plaetze).IsRequired();
// ----------- Berechnete Spalte
f.Property(x => x.Auslastung)
.HasComputedColumnSql("100.0-(([FreiePlaetze]*1.0)/[Plaetze])*100.0");
// ----------- Standardwerte
f.Property(x => x.Preis).HasDefaultValue(123.45m);
f.Property(x => x.Abflugort).HasDefaultValue("(offen)");
f.Property(x => x.Zielort).HasDefaultValue("(offen)");
f.Property(x => x.Datum).HasDefaultValueSql("getdate()");
// ----------- Indexe
// Index über eine Spalte
f.HasIndex(x => x.FreiePlaetze).HasName("Index_FreiePlaetze");
// Index über zwei Spalten
f.HasIndex(x => new { x.Abflugort, x.Zielort });
}
}
}

Diese Konfigurationsklasse wird dann mit modelBuilder.ApplyConfiguration<Entitätstyp>(Konfigurationsobjekt) in OnModelCreating() eingebunden:

modelBuilder.ApplyConfiguration<Flug>(new FlugETC());

Wie so oft in der Welt der Core-Produkte hinkt die Dokumentation der Implementierung deutlich hinterher. So ist IEntityTypeConfiguration<Entitätstyp> zwar kurz in dem "New features"-Dokument erwähnt, sonst in der Dokumentation aber nicht vorhanden.