Neuerungen in EF Core 10
EF Core 10 (EF10) ist die nächste Version nach EF Core 9 und ist für die Veröffentlichung im November 2025 geplant.
EF10 ist als tägliche Builds verfügbar, die alle neuesten EF10-Features und API-Optimierungen enthalten. Die Beispiele hier nutzen diese täglichen Builds.
Tipp
Sie können die Beispiele ausführen und debuggen, indem Sie den Beispielcode von GitHubherunterladen. Jeder Abschnitt unten verweist auf den Quellcode, der für diesen Abschnitt spezifisch ist.
EF10 erfordert das .NET 10 SDK zum Erstellen sowie die .NET 10-Laufzeit für die Ausführung. EF10 wird nicht in früheren .NET-Versionen ausgeführt und wird nicht unter .NET Framework ausgeführt.
Tipp
Die Dokumente zu den Neuigkeiten werden für jede Vorschauversion aktualisiert. Alle Beispiele sind für die Verwendung der täglichen EF10-Builds ausgelegt, die im Vergleich zur letzten Vorschauversion in der Regel mehrere zusätzliche Wochen an abgeschlossener Arbeit aufweisen. Wir empfehlen dringend die Verwendung der täglichen Builds beim Testen neuer Features, damit Sie Ihre Tests nicht gegen veraltete Bits durchführen.
LINQ- und SQL-Übersetzung
Weitere Abfrageverbesserungen
- Übersetzung für DateOnly.ToDateTime(timeOnly) (#35194, von @mseada94).
- Optimierung für mehrere aufeinander folgende
LIMIT
s(#35384), beigetragen von @ranma42. - Optimierung für die Verwendung des
Count
-Vorganges aufICollection<T>
(#35381), beigetragen von @ChrisJollyAU).
ExecuteUpdateAsync akzeptiert jetzt eine normale Lambda-Funktion ohne Ausdruck
Die ExecuteUpdateAsync kann verwendet werden, um beliebige Aktualisierungsvorgänge in der Datenbank auszudrücken. In früheren Versionen wurden die Änderungen, die für die Datenbankzeilen ausgeführt werden sollen, über einen Ausdrucksstrukturparameter bereitgestellt; Dies hat es recht schwierig gemacht, diese Änderungen dynamisch zu erstellen. Angenommen, wir möchten die Ansichten eines Blogs aktualisieren, aber bedingt auch den Namen. Da das Setter-Argument ein Ausdrucksbaum war, musste folgender Code geschrieben werden:
// Base setters - update the Views only
Expression<Func<SetPropertyCalls<Blog>, SetPropertyCalls<Blog>>> setters =
s => s.SetProperty(b => b.Views, 8);
// Conditionally add SetProperty(b => b.Name, "foo") to setters, based on the value of nameChanged
if (nameChanged)
{
var blogParameter = Expression.Parameter(typeof(Blog), "b");
setters = Expression.Lambda<Func<SetPropertyCalls<Blog>, SetPropertyCalls<Blog>>>(
Expression.Call(
instance: setters.Body,
methodName: nameof(SetPropertyCalls<Blog>.SetProperty),
typeArguments: [typeof(string)],
arguments:
[
Expression.Lambda<Func<Blog, string>>(Expression.Property(blogParameter, nameof(Blog.Name)), blogParameter),
Expression.Constant("foo")
]),
setters.Parameters);
}
await context.Blogs.ExecuteUpdateAsync(setters);
Das manuelle Erstellen von Ausdrucksbäumen ist kompliziert und fehleranfällig, wodurch dieses häufige Szenario viel schwieriger wurde, als es sein sollte. Ab EF 10 können Sie stattdessen Folgendes schreiben:
await context.Blogs.ExecuteUpdateAsync(s =>
{
s.SetProperty(b => b.Views, 8);
if (nameChanged)
{
s.SetProperty(b => b.Name, "foo");
}
});
Dank @aradalvand für das Vorschlagen und Durchsetzen dieser Änderung (in #32018).