Freigeben über


Neue Features in EF Core 2.1

Neben zahlreichen Fehlerbehebungen und kleinen Funktions- und Leistungsverbesserungen umfasst EF Core 2.1 einige überzeugende neue Features:

Lazy Loading (verzögertes Laden)

EF Core enthält nun die erforderlichen Bausteine für Benutzende, die Entitätsklassen zum bedarfsgesteuerten Laden ihrer Navigationseigenschaften erstellen möchten. Außerdem haben wir ein neues Paket, Microsoft.EntityFrameworkCore.Proxies, erstellt, das diese Bausteine nutzt, um Lazy-Loading-Proxyklassen basierend auf minimal geänderten Entitätsklassen (z. B. Klassen mit virtuellen Navigationseigenschaften) zu erstellen.

Weitere Informationen zu diesem Thema finden Sie im Abschnitt zum Lazy Loading.

Parameter in Entitätskonstruktoren

Als einer der erforderlichen Bausteine zum Lazy Loading haben wir die Erstellung von Entitäten ermöglicht, die Parameter in ihren Konstruktoren akzeptieren. Sie können mithilfe von Parametern Eigenschaftswerte, Delegaten zum Lazy Loading und Dienste einfügen.

Weitere Informationen zu diesem Thema finden Sie im Abschnitt zum Entitätskonstruktor mit Parametern.

Wertkonvertierungen

Bisher konnte EF Core nur Eigenschaften von Typen zuordnen, die vom zugrunde liegenden Datenbankanbieter nativ unterstützt werden. Werte wurden ohne Transformation zwischen Spalten und Eigenschaften hin- und her kopiert. Ab EF Core 2.1 können Wertkonvertierungen angewendet werden, um die aus Spalten abgerufenen Werte zu transformieren, bevor sie auf Eigenschaften angewendet werden und umgekehrt. Wir verfügen über eine Reihe von Konvertierungen, die der Konvention entsprechend bei Bedarf angewendet werden können, sowie über eine explizite Konfigurations-API, die die Registrierung von benutzerdefinierten Konvertierungen zwischen Spalten und Eigenschaften ermöglicht. Einige der Anwendungen dieses Features sind:

  • Speichern von Enums als Zeichenfolgen
  • Zuordnen von ganzen Zahlen ohne Vorzeichen mit SQL Server
  • Automatische Ver- und Entschlüsselung von Eigenschaftswerten

Für weitere Informationen zu diesem Thema lesen Sie den Abschnitt zu Wertkonvertierungen.

LINQ-GroupBy-Übersetzung

Vor Version 2.1 würde der GroupBy LINQ-Operator in EF Core immer im Arbeitsspeicher ausgewertet. Nun bieten wir in den meisten Fällen Unterstützung für dessen Übersetzung in die GROUP BY-SQL-Klausel.

Dieses Beispiel zeigt eine Abfrage mit GroupBy, die zum Berechnen verschiedener Aggregatfunktionen verwendet wird:

var query = context.Orders
    .GroupBy(o => new { o.CustomerId, o.EmployeeId })
    .Select(g => new
        {
          g.Key.CustomerId,
          g.Key.EmployeeId,
          Sum = g.Sum(o => o.Amount),
          Min = g.Min(o => o.Amount),
          Max = g.Max(o => o.Amount),
          Avg = g.Average(o => o.Amount)
        });

Die entsprechende SQL-Übersetzung sieht wie folgt aus:

SELECT [o].[CustomerId], [o].[EmployeeId],
    SUM([o].[Amount]), MIN([o].[Amount]), MAX([o].[Amount]), AVG([o].[Amount])
FROM [Orders] AS [o]
GROUP BY [o].[CustomerId], [o].[EmployeeId];

Datenseeding

Mit der neuen Version ist es möglich, erste Daten zum Auffüllen einer Datenbank bereitzustellen. Im Gegensatz zu EF6 wird das Datenseeding mit einem Entitätstyp als Teil der Modellkonfiguration verknüpft. EF Core-Migrationen können anschließend automatisch berechnen, welche Einfüge-, Aktualisierungs- oder Löschvorgänge angewendet werden müssen, wenn die Datenbank auf eine neue Version des Modells aktualisiert wird.

Beispielsweise können Sie damit Seeddaten für ein Post-Element in OnModelCreating konfigurieren:

modelBuilder.Entity<Post>().HasData(new Post{ Id = 1, Text = "Hello World!" });

Weitere Informationen zu diesem Thema finden Sie im Abschnitt zum Datenseeding.

Abfragetypen

Ein EF Core-Modell kann jetzt Abfragetypen enthalten. Im Gegensatz zu Entitätstypen haben Abfragetypen keine definierten Schlüssel und können nicht eingefügt, gelöscht oder aktualisiert werden (d. h. sie sind schreibgeschützt), aber sie können direkt durch Abfragen zurückgegeben werden. Einige der Verwendungsszenarien für Abfragetypen sind:

  • Zuordnen zu Ansichten ohne Primärschlüssel
  • Zuordnen mit Tabellen ohne Primärschlüssel
  • Zuordnen mit im Modell definierten Abfragen
  • Verwendung als Rückgabetyp für FromSql()-Abfragen

Weitere Informationen zu diesem Thema finden Sie im Abschnitt zu Abfragetypen.

Einschließen für abgeleitete Typen

Nun ist es möglich, beim Schreiben von Ausdrücken für die Include-Methode nur für abgeleitete Typen definierte Navigationseigenschaften anzugeben. Für die stark typisierte Include-Version unterstützen wir entweder die Verwendung einer expliziten Umwandlung oder des as-Operators. Nun bieten wir auch Unterstützung für den Verweis der für abgeleitete Typen definierten Namen der Navigationseigenschaften in der Zeichenfolgenversion Include:

var option1 = context.People.Include(p => ((Student)p).School);
var option2 = context.People.Include(p => (p as Student).School);
var option3 = context.People.Include("School");

Weitere Informationen zu diesem Thema finden Sie im Abschnitt zum Einschließen mit abgeleiteten Typen.

System.Transactions-Unterstützung

Wir haben die Funktion hinzugefügt, mit System.Transactions-Funktionen wie TransactionScope zu arbeiten. Dies funktioniert sowohl bei .NET Framework als auch .NET Core bei Verwendung von Datenbankanbietern, die es unterstützen.

Weitere Informationen zu diesem Thema finden Sie im Abschnitt zu System.Transactions.

Bessere Spaltensortierung bei der anfänglichen Migration

Basierend auf dem Kundenfeedback haben wir Migrationen aktualisiert, sodass Spalten für Tabellen nun in der Reihenfolge generiert werden, in der die Eigenschaften in den Klassen deklariert sind. Beachten Sie, dass EF Core die Reihenfolge nicht ändern kann, wenn neue Member nach der ersten Tabellenerstellung hinzugefügt werden.

Optimierung korrelierter Unterabfragen

Wir haben unsere Abfrageübersetzung verbessert, um die Ausführung von SQL-Abfragen "N + 1" in vielen gängigen Szenarien zu vermeiden, in denen die Verwendung einer Navigationseigenschaft in der Projektion dazu führt, Daten aus der Stammabfrage mit Daten aus einer korrelierten Unterabfrage zu verknüpfen. Für die Optimierung ist das Puffern der Ergebnisse aus der Unterabfrage erforderlich. Zudem ist es erforderlich, die Abfrage zum Auswählen des neuen Verhaltens zu ändern.

Die folgende Abfrage wird z. B. normalerweise in eine Abfrage für Kunden plus N separate Abfragen für Aufträge übersetzt („N“ steht hierbei für die Anzahl der zurückgegebenen Kunden):

var query = context.Customers.Select(
    c => c.Orders.Where(o => o.Amount  > 100).Select(o => o.Amount));

Durch Einschließen von ToListAsync() an der richtigen Stelle geben Sie an, dass eine Pufferung für die Aufträge angemessen ist, was die Optimierung ermöglicht:

var query = context.Customers.Select(
    c => c.Orders.Where(o => o.Amount  > 100).Select(o => o.Amount).ToList());

Beachten Sie, dass diese Abfrage nur in zwei SQL-Abfragen übersetzt wird: Eine für Kunden und die nächste für Bestellungen.

Das [Owned]-Attribut

Es ist jetzt möglich, von verwaltete Entitätstypen zu konfigurieren, indem Sie einfach den Typ mit [Owned] annotieren und dann sicherstellen, dass die Besitzerentität dem Modell hinzugefügt wird.

[Owned]
public class StreetAddress
{
    public string Street { get; set; }
    public string City { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public StreetAddress ShippingAddress { get; set; }
}

Das Befehlszeilentool dotnet-ef ist im .NET Core SDK enthalten.

Die dotnet-ef-Befehle sind nun im .NET Core SDK enthalten. Deshalb ist es nicht mehr erforderlich, „DotNetCliToolReference“ für Migrationen oder die Erstellung eines DbContext-Gerüsts aus einer vorhandenen Datenbank im Projekt zu verwenden.

Weitere Informationen zum Aktivieren von Befehlszeilentools für unterschiedliche Versionen des .NET Core SDK und EF Core finden Sie im Abschnitt Installieren der Tools.

Paket „Microsoft.EntityFrameworkCore.Abstractions“

Das neue Paket enthält Attribute und Schnittstellen, die Sie in Ihren Projekten verwenden können, um EF Core-Features zu aktivieren, ohne eine Abhängigkeit von EF Core als Ganzes einzugehen. Das [Owned]-Attribut und die ILazyLoader-Schnittstelle sind beispielsweise enthalten.

Zustandsänderungsereignisse

Neue Tracked und StateChanged Ereignisse für ChangeTracker können verwendet werden, um Logik zu schreiben, die auf Entitäten reagiert, die in den DbContext gelangen oder ihren Zustand ändern.

Raw-SQL-Parameteranalyse

Eine neue Codeanalyse ist in EF Core enthalten, die potenziell unsichere Verwendungen unserer RAW-SQL-APIs wie FromSql oder ExecuteSqlCommanderkennt. Für die folgende Abfrage wird beispielsweise eine Warnung angezeigt, da minAge nicht parametrisiert ist:

var sql = $"SELECT * FROM People WHERE Age > {minAge}";
var query = context.People.FromSql(sql);

Kompatibilität von Datenbankanbietern

Es wird empfohlen, EF Core 2.1 mit Anbietern zu verwenden, die aktualisiert oder zumindest getestet wurden, um mit EF Core 2.1 zu arbeiten.

Tipp

Falls unerwarteterweise keine Kompatibilität besteht oder Probleme mit den neuen Features auftreten, oder falls Sie uns Ihr Feedback mitteilen möchten, melden Sie uns dies über unsere Problemverfolgung.