Mit dem Release von .NET Core 3.0 ist eine neues Major Release erschienen, das eine Vielzahl an Änderungen mit sich bringt. Besonders im Entity Framework Core 3.0 gibt es zahlreiche Breaking Changes. Warum ein Blick sinnvoll ist? Lesen Sie hier!
Zu den Breaking Changes
Breaking Changes können im Entwickleralltag eine nervenaufreibende Sache sein, da bei Versionswechsel häufig Code angepasst werden muss. Trotzdem sind die Anpassungen hilfreich. Sie bringen die Zukunftsfähigkeit von EF .NET Core einen großen Schritt voran. Zudem erhöhen sie die Stabilität sowie die Erweiterbarkeit stark.
Im Folgenden sind lediglich, die als „hoch“ klassifizierten, Breaking Changes aufgelistet. Die vollständige Liste enthält um die 50 Breaking Changes und zeigt damit, wie ernst Microsoft es meint. Die komplette Übersicht über alle Breaking Changes finden Sie hier.
- LINQ-Abfragen werden nicht mehr auf dem Client ausgewertet
Vor der Version 3.0 konnten in bestimmten Fällen Ausdrücke auf dem Client ausgewertet werden und es wurde nur eine Warnung angezeigt. Ab 3.0 wird für Teile (SQL oder Parameter), welche nicht mehr konvertierbar sind, eine Exception geworfen.
- Core 3.0 zielt auf .NET Standard 2.1
Frühere Versionen zielten auf .NET Standard 2.0 ab. Auch das .NET Framework zielt darauf ab. Mit 3.0 wird das .NET Framework nicht mehr miteingeschlossen. Falls früher oder später auf die modernen Plattformen gewechselt werden soll, empfiehlt es sich frühzeitig auf 3.0 zu gehen. Anderenfalls kann weiterhin EF Core 2.1 oder 2.2 verwendet werden, da diese noch das .NET Framework unterstützen.
- EF Core-Befehlszeilentool ist nicht mehr Teil von .NET Core SDK
Ab Version 3.0 ist das -ef-Tool nicht mehr direkt verfügbar und muss explizit installiert werden. Hiermit wird beabsichtigt, auf eine reguläre NuGet-Verteilung hinzuwirken. Mit „$ dotnet tool install –global dotnet-ef“ kann das Tool als globales Tool installiert werden.
- DetectChanges berücksichtigt vom Speicher generierte Schlüsselwerte
Mit der Version 3.0 werden Entitäten im Modified-Zustand und nicht mehr im Added-Zustand überwacht. Die Änderung wurde vorgenommen, um die Arbeit mit dem Entitätsgraphen zu vereinfachen und konsistenter zu gestalten. Sie kann dazu führen, dass eine Anwendung nicht mehr funktionsfähig ist. Dies kann durch die explizite Angabe der Schlüsseleigenschaften vermieden werden.
- Umbenennung von FromSql, ExecuteSql und ExecuteSqlAsync
Ab Version 3.0 müssen die Methoden FromSqlRaw, ExecuteSqlRaw und ExecuteSqlRawAsync verwendet werden, um parametrisierte Abfragen zu erstellen. Die vorherigen Methodenüberladungen konnten zu einer fälschlichen Verwendung und Fehlergebnissen führen.
- Abfragetypen werden mit Entitätstypen zusammengeführt
Mit der neuen Version wird aus einem Abfragetyp direkt ein Entitätstyp ohne Primärschlüssel. Die Aufrufe ModelBuilder.Query<>(), DbQuery<> und DbContext.Query<>() sind als obsolet markiert worden. Sie sollen über alternative Wege aufgerufen werden.
Verbesserungen und Änderungen
Einige Änderungen sind Verbesserungen, die zu Performancesteigerungen führen. Beispielsweise wird DetectChanges, bei Zugriff auf die Entry-Methode, nicht mehr für alle Objekte in der Kontextklasse ausgeführt. Die Ausführung geschieht nur noch für die betroffenen oder direkt zugeordneten Objekte. Für einige asynchrone Methoden verwendet Microsoft anstatt Task<T> nun den Rückgabetyp ValueTask<T>, welcher erst seit C#7.0 existiert. Hierdurch kann die Speicherallokation auf dem Heap verringert werden.
Beispiele:
- FindAsync()
- AddAsync()
Auch wurden einige Umbenennungen durchgeführt, sodass Aufrufe angepasst werden müssen. Erfreulicherweise haben sich die Namen nur geringfügig geändert. Das sorgt dafür, dass viele dieser Änderungen vom Compiler schon direkt bemerkt werden.
Beispiele:
- QueryFilter –> GetQueryFilter()
- AfterSaveBehavior –> GetAfterSaveBehavior()
- ForSqlServerHasIndex().ForSqlServerInclude() –> HasIndex().ForSqlServerInclude()
Neue Features
Im Vergleich zu den Breaking Changes ist die Liste neuer Funktionen eher gering. Trotzdem stellen einige Funktionen einen großen Reiz für den Umstieg dar. Im Folgenden ein Auszug:
- LINQ-Überarbeitungen: Eingeschränkte Clientauswertung
Wie bereits am Anfang des Artikels erwähnt, ist dieses neue Feature gleichzeitig auch einer der großen Breaking Changes. An diesen Stellen konnten vorher in bestimmten Fällen erhebliche Laufzeitprobleme auftreten. Mit der Umstellung auf LINQ to Objects können Prädikatbedingung wieder ausgewertet werden.Abbildung 1: LINQ-Überarbeitungen
- Cosmos DB-Unterstützung
Azure Cosmos DB kann nun als Anwendungsdatenbank-Ziel eingesetzt werden. Einige Vorteile von Cosmos-DB (z.B. Globale Verteilung, Always On-Verfügbarkeit, etc.) können nun vom Entwickler direkter genutzt werden. Gleichzeitig werden EF Core-Features unterstützt. Details sehen Sie hier.
- C# 8.0-Ünterstützung: Asynchrone Streams
Besonders schön ist auch die Unterstützung der neuen Sprachfeatures. Asynchrone Abfrageergebnisse können direkt mit await foreach konsumiert werden.Abbildung 2: await foreach
- C# 8.0-Ünterstützung: Nullwerte zulassende Verweistypen
Nullable Reference Types werden als optional behandelt und andere als [Required]. Ist die Funktion hierfür aktiviert, so werden die Eigenschaften auf die entsprechenden Spalten und Beziehungen auf die Datenbank angewendet.Abbildung 3: Nullable References
- EF 6.3 unter .NET Core
Dies ist keine neue Funktionalität von EF Core 3.0, sondern eine Portierung von EF 6. Microsoft hat erkannt, dass viele Kunden in der Umstiegsphase nicht komplett ihre Abhängigkeiten zum Entity Framework lösen können. Daher hat Microsoft diese Portierung veröffentlicht, sodass sie unter .NET Core 3.0 ausgeführt werden kann. Es sollte dabei mit Einschränkungen gerechnet werden.
Fazit
Mit dem Entity Framework Core 3.0 hat Microsoft den nächsten Meilenstein gelegt. Erweiterungen können nun besser in Nachfolgeversionen einziehen. Bestehende Inkonsistenzen wurden bereinigt. Auch der Einzug der neuen Sprachfeatures wird helfen, die Mächtigkeit des EF noch weiter nutzen zu können.
Ob ein Umstieg auf EF Core 3.0 für bestehende Anwendungen sinnvoll ist, sollte unter den gegebenen Umständen hart geprüft werden. Besonders, weil EF Core 3.0 noch keinen Long Term Support bietet. Im November erscheint dann .NET Core 3.1 mit LTS. Aber vielleicht hilft ein vorheriger Blick, um auf die anstehenden Umbaumaßnahmen vorbereitet zu sein.
Sprechen Sie uns an, wenn auch Sie Fragen zu Themen rund um .NET Core haben oder Hilfe bei Portierung Ihrer Anwendung nach .NET Core 3.0 in Ihrem Unternehmen benötigen. Wir führen Sie gerne ans Ziel.