Mit der Veröffentlichung von .NET 5 gibt es auch eine neue Version des Entity Framework Core (EF Core). Welche Neuerungen die Datenstrukturmodellierung mit EF Core 5 erleichtern und wie die neuen Funktionen eingesetzt werden können, wird im nachfolgenden Blogpost in kleinen Codebeispielen gezeigt.
Simple Logging
Eine der neuen Methoden ist die LogTo()-Methode, welche es ermöglicht, dem DbContext ein Ziel für das Logging zu geben. Zuvor benötigte man für das Anpassen der Log-Senke externe Abhängigkeiten zu Microsoft.Extensions.Logging. Nun ist es möglich, während der Konfiguration einer DbContext-Instanz LogTo() aufzurufen.
protected override void OnConfiguring(DbContextOptionsBuilder builder) => builder.LogTo(Console.WriteLine);
Außerdem kann es auch als Teil von AddDbContext<DbContextType> der ServiceCollection aufgerufen werden, wenn Dependency Injection genutzt wird.
Services.AddDbContext<MyDbContext>(b => b.UseSqlServer(connectionString) .LogTo(Console.WriteLine));
LogTo() wird als einfache Alternative zur Microosoft.Extensions.Logging Integration gesehen, um in der Entwicklung einfach an die Logs zu gelangen. Für den produktiven Einsatz wird weiterhin Microsoft.Extensions.Logging als Lösung empfohlen.
ChangeTracker.Clear()
Eine der kleineren Verbesserungen ist die DbContext.ChangeTracker.Clear()-Methode, die alle zur Zeit des Aufrufs nachverfolgten Entitäten leert. Normalerweise ist dies nach Best Practice nicht nötig, da jede Operation einen eigenen DbContext erhält. Falls die Softwarearchitektur dies jedoch nicht zulässt, ist hiermit eine Möglichkeit gegeben, den DbContext zu bereinigen.
Automated Many-To-Many & Required 1-To-1 Relations
EF Core 5 unterstützt nun automatisierte Many-To-Many Beziehungen. Konkret heißt das, dass man keine expliziten Join-Entitäten mehr anlegen muss. Die betroffenen Klassen können jetzt direkt mit Navigation-Properties verbunden werden, was viele Abfragen einfacher und klarer macht. Das Framework erzeugt automatisch auf der Datenbank die entsprechende Join-Tabelle und befüllt diese auch beim Hinzufügen oder Entfernen von Entitäten.
public class User { public int Id { get; set; } public string Name {get; set; } public ICollection<Group> Groups { get; set; } } public class Group { public int Id { get; set; } public string Name { get; set; } public ICollection<User> Users { get; set; } } // Daten hinzufügen var jane = new User { Name = "Jane" }; var john = new User { Name = "John" }; var userGroup = new Group { Name = "Users", Users = new List<User> { jane, john }}; var adminGroup = new Group { Name = "Admins", Users = new List<User> { jane }}; dbContext.AddRange(userGroup, adminGroup); await dbContext.SaveChangesAsync(); // Daten abfragen var admins = await dbContext.Users.Where(u => u.Groups.Any(g => g.Name == "Admins")).ToListAsync();
Ein weiteres Mapping-Feature ist die Verbesserung von Required 1-To-1 Beziehungen. Hier ist es in der Fluent-API nun möglich die Subentität über das Navigation Property als Required zu kennzeichnen. Dadurch ist das Zuweisen von null zur Subentität nicht mehr möglich und erzeugt somit einen Fehler. Außerdem werden die Datenbankspalten dann korrekt auf NOT NULL gesetzt, wenn sie im Model als Required gekennzeichnet sind.
protected override void OnModelCreating(ModelBuilder builder) { builder.Entity<Person>(b => { b.OwnsOne(e => e.HomeAddress); b.Navigation(e => e.HomeAddress).IsRequired(); }); }
DB-First Scaffolding
Auch beim Database-First Ansatz hat sich einiges verändert. So ist es nun möglich, im Scaffolding die Verbindungsparameter zu entfernen und separate Namespaces für Entitäten und DbContext zu definieren.
dotnet ef dbcontext scaffold "[connectionString]" Microsoft.EntityFrameworkCore.SqlServer --no-onconfiguring –context-namespace "My.Context.Namespace" –namespace "My.Model.Namespace"
Außerdem wurde ein Pluralisier integriert, welcher die Tabellen-Namen in den Plural bzw. den Entitäten-Namen in den Singular setzt.
Fazit
Version 5 des Entity Framework Core wartet mit einer Vielzahl an neuen Features auf, welche zum Teil lange von der Community gewünscht waren. Neben großen Änderungen wie den Many-To-Many Relations gibt es eine Vielzahl an kleinen Verbesserungen, welche für einfacheren und lesbareren Code sorgen.
Die Microsoft Dokumentation gibt Aufschluss über die neuen Features. Ich persönlich empfinde die Neuerungen als sehr gelungen und bin gespannt wie ich diese in meinen Entwickleralltag integrieren kann.
Sprechen Sie uns an, wenn auch Sie Fragen zu Themen rund um .NET haben oder Hilfe bei Portierung Ihrer Anwendung nach .NET 5.0 und EF Core 5 in Ihrem Unternehmen benötigen. Wir führen Sie gerne ans Ziel.