Microsoft legt die dritte Vorschau auf .NET 5.0 nach

Auch die dritte Vorschauversion auf das kommende .NET 5.0 bringt nur kleinere Verbesserungen, aber noch nicht den angekündigten großen Wurf.

In Pocket speichern vorlesen Druckansicht 11 Kommentare lesen
.NET 5: Zweite Preview mit viel Feinschliff erschienen
Lesezeit: 7 Min.
Von
  • Dr. Holger Schwichtenberg
Inhaltsverzeichnis

Microsoft behält bei den Vorschauversionen der kommenden .NET Version 5.0 die kurze Taktfrequenz bei: Nach Preview 1 am 16. März 2020 und Preview 2 am 2. April 2020 folgt nun eine dritte Vorschauversion, die aber weiterhin nicht die im Mai 2019 angekündigten Neuerungen im Bereich Konsolidierung und Ahead-of-Time-Kompilierung liefert.

Die Preview-3-Version (interne Versionsnummer: v5.0.0-preview.3.20216.6) bietet Verbesserungen des vom Just-in-Time-Compiler generierten Maschinencode (vgl. Liste im Blogeintrag) sowie Erweiterungen für den in .NET Core 3.0 neu eingeführten JSON-Serialisierer System.Text.Json. Er kann nun wie sein Vorgänger JSON.NET zirkuläre Referenzen im Objektmodell ignorieren und bietet neue Erweiterungsmethoden (GetFromJsonAsync(), PostAsJsonAsync(), PutAsJsonAsync() und ReadFromJsonAsync()) für die Serialisierung und Deserialisierung in der Klasse HttpClient. Diese liegen im Namensraum System.Net.Http.Json.

Einige Neuerungen bekommen .NET-Nutzer in Entity Framework Core 5.0. Hier hat Microsoft die seit langem fehlende Möglichkeit eingebaut, beim Eager Loading verbundener Datensätze nur eine Teilmenge zu laden. Wenn man zu einer Menge von Flügen die Buchungen und die zugehörigen Passagiere laden wollte, konnte man bisher nur alle Passagiere für die gewählten Flüge mitladen:

var flightSet = ctx.FlightSet
.Include(b => b.BookingSet).ThenInclude(x => x.Passenger)
.Where(f=>f.Departure =="Berlin" && f.BookingSet.Any(b=>b.PassengerID > 2000)).Take(10).ToList();

Nun ist eine zusätzliche Mengeneinschränkung bezüglich der verbundenen Passagiere möglich:

var flightSet = ctx.FlightSet
.Include(b => b.BookingSet.Where(p => p.PassengerID > 2000)).ThenInclude(x => x.Passenger)
.Where(f=>f.Departure =="Berlin" && f.BookingSet.Any(b=>b.PassengerID > 2000)).Take(10).ToList();

Allerdings sind aktuell nur Bedingungen möglich, die sich direkt auf die verbundene Tabelle beziehen. Eine Bedingung über den Passagiernamen lässt sich in der Preview-3-Version von Entity Framework Core 5.0 weder in Include()

var flightSet = ctx.FlightSet
.Include(b => b.BookingSet.Where(p => p.Passenger.FullName.StartsWith("M")).ThenInclude(x => x.Passenger)
.Where(f => f.Departure == "Berlin" && f.BookingSet.Any(b => b.PassengerID > 2000)).Take(10).ToList();

noch in ThenInclude() formulieren:

var flightSet = ctx.FlightSet
.Include(b => b.BookingSet).ThenInclude(x => x.Passenger.Where(p => p.FullName.StartsWith("M"))
.Where(f => f.Departure == "Berlin" && f.BookingSet.Any(b => b.PassengerID > 2000)).Take(10).ToList();

In der Kontextklasse können Entwickler nun neben EnableSensitiveDataLogging(true) mit EnableDetailedErrors() auch im Fall von Datensätzen mit Null-Werten detaillierte Fehlermeldungen erhalten:

builder.EnableSensitiveDataLogging(true).EnableDetailedErrors();

Dieser Aufruf verringert allerdings die Ausführungsgeschwindigkeit etwas und sollte daher nur zur Diagnose eingesetzt werden.

In der Fluent-API zur Modellkonfiguration findet sich nun eine neue Methode Navigation(), mit der sich Einstellungen wie das zugehörige Field zu einem Property für Beziehungen zwischen Entitätsklassen festlegen lassen:

modelBuilder.Entity<Flight>().Navigation(e => e.Pilot).HasField("pilot_field");

Auch die PowerShell-Commandlets und klassischen Kommandozeilenbefehle für Entity Framework Core hat der Hersteller erweitert. Scaffold-DbContext und dotnet ef dbcontext scaffold bieten nun den Parameter "context-namespace" mit dem der Entwickler die Kontextklasse in einen anderen Namensraum als die Entitätsklassen (Parameter "Namespace") legen kann. Bisher wurden beide Klassenarten im Standardnamensraum des Zielprojekts erstellt. Die neuen Namensraumparameter bieten hier mehr Flexibilität, um die Entitätsklasse und die Kontextklasse in verschiedene DLLs zu trennen, wie dies in der Softwarearchitektur üblich ist.

dotnet ef database update und Update-Database bieten nun den neuen Parameter "Connection", mit dem Entwickler direkt angeben können, in welcher Datenbank das Schema aktualisiert werden soll. Bisher mussten Entwickler die Datenbank im Programmcode der Kontextklasse festlegen.

Für Nutzer von Microsoft SQL Server-Datenbanken steht nun auch die Transact-SQL-Funktion DATALENGTH()in Entity Framework Core zur Verfügung. DATALENGTH() ermittelt die Anzahl der Bytes, die ein Wert in der Datenbank verbraucht:

using (var ctx = new WWWingsContext())
{
var flightSetWithDepartureNamesRequiringMoreThen25Bytes = ctx.FlightSet.Where(c => EF.Functions.DataLength(c.Departure) > 25);
foreach (var f in flightSetWithDepartureNamesRequiringMoreThen25Bytes)
{
Console.WriteLine(f.Departure + " " + f.Departure.Length);
}
}

Nutzer von Microsofts Cloud-Datenbank CosmosDB können nun in LINQ-Abfragen mit WithPartitionKey() auch eine Partition angeben.

Entity Framework Core 5.0 Preview 3 läuft nicht nur auf .NET 5.0, sondern auf allen Plattformen, die .NET Standard 2.1 anbieten (also z.B. .NET Core 3.1 und aktuelle Xamarin-Versionen).

In ASP.NET Core 5.0 Preview hat Microsoft die Leistungen der Implementierung des Protokolls HTTP/2 optimiert.

In der parallel veröffentlichten Preview-5-Version von Blazor WebAssembly 3.2 (interne Version 3.2.0-preview5.20216.8) ist in der Program.cs-Startdatei ein komfortabler Zugriff auf Einstellungen in der appsettings.json über die Eigenschaft Configuration in der Klasse WebAssemblyHostBuilder möglich. Für das Deployment auf einen Internet Information Server (IIS) können Entwickler nun auch eine web.config-Datei angeben. Verzichten sie darauf, erzeugt Blazor WebAssembly automatisch eine solche Datei.

Außerdem hat Microsoft die Klasse HttpRequestMessage für den Aufruf von HTTP-/REST-Diensten um die Methoden SetBrowserRequestCredentials(), SetBrowserRequestCache(), SetBrowserRequestMode() und SetBrowserRequestIntegrity() erweitert. Man findet sie im Namensraum Microsoft.AspNetCore.Components.WebAssembly.Http. Zusätzlich hat Microsoft das Anfügen von Authentifizierungstoken an ausgehende HTTP-Anfragen erleichtert:

builder.Services.AddSingleton(sp =>
{
return new HttpClient(sp.GetRequiredService<AuthorizationMessageHandler>()
.ConfigureHandler(
new [] { "https://www.example.com/base" },
scopes: new[] {"example.read", "example.write"}))
{
BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)
};
});

Die Installationsroutinen für .NET 5.0 Preview 3 inklusive ASP.NET Core 5.0 Preview 3 erhalten interessierte Nutzer auf dem Downloaad-Server von Microsoft. Entity Framework Core 5.0 Preview 3 liegt auf NuGet.Org bereit.

Installation von .NET 5.0 Preview 3

Die aktualisierten Projektvorlagen für Blazor WebAssembly installiert man mit dem Kommandozeilenbefehl, sofern das .NET Core SDK 3.1.201 vorhanden ist:

dotnet new -i Microsoft.AspNetCore.Components.WebAssembly.Templates::3.2.0-preview5.20216.8.

Am 19. Mai 2020 beginnt Microsofts Build-Konferenz, die aufgrund der Covid-19-Pandemie dieses Jahr als virtuelle Konferenz abläuft und allen Interessierten kostenfrei offensteht. Zur Build sind umfangreichere Ankündigungen zu .NET 5.0 und der Version 9.0 der Programmiersprache C# zu erwarten. (map)