Übersichtliche Konfiguration in Entity Framework Core mit IEntityTypeConfiguration<T>
Entity Framework Core 2.0 bietet nun die Schnittstelle IEntityTypeConfiguration
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 [1] (erschienen am 14.08.2017) konnte man die Klasse OnModelCreating() durch Unterroutinen zerlegen.
Mit Entity Framework Core 2.0 [2] 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 [3] erwähnt, sonst in der Dokumentation aber nicht vorhanden. ( [4])
URL dieses Artikels:
https://www.heise.de/-3829963
Links in diesem Artikel:
[1] http://www.dotnet-lexikon.de/Entity_Framework_Core/lex/9074.aspx
[2] http://www.dotnet-lexikon.de/Entity_Framework_Core/lex/9074.aspx
[3] https://docs.microsoft.com/en-us/ef/core/what-is-new/
[4] mailto:hs@ix.de
Copyright © 2017 Heise Medien