.NET 8.0 biegt mit Release Candidate 1 auf die Zielgerade ein

Seite 2: Weitere Verbesserungen für Blazor

Inhaltsverzeichnis

Die Routing-Einstellungen in einzelnen Blazor-Komponenten beherrschen nun auch bisher nur in ASP.NET MVC, Razor Pages und WebAPI verfügbare Optionen. Dazu gehören:

  • Parameter innerhalb eines Routing-Segments, z. B.
@page "/counter{currentCount}"
  • Standardwerte für Routing-Segmente, z. B.
@page "/counter/{currentCount=5}"
  • oder auch
@page "/counter{currentCount=5}"
  • Restriktionen auf Typ (z. B. int, bool, datetime, guid) und Wertebereich (z. B. range(min,max), length(zeichenanzahl) und regex(ausdruck)). Beispiele:
@page "/counter{currentCount:int:range(0,10)=5}" 
  • und
@page "/counter/{currentCount:int:range(0,10)=5}"

Eine weitere neue Blazor-Funktion ist NavigationManager.Refresh(), mit der man ein Neuladen der aktuellen Seite erzwingen kann. NavigationManager.Refresh(forceReload: true) sorgt für ein komplettes Neuladen ohne Versuch, bereits geladene Seitenteile zu erhalten.

Mit EditContext.IsValid(FieldIdentifier) können Entwicklerinnen und Entwickler nun einzelne Eingabefelder auf die Gültigkeit der Eingaben überprüfen.

Anders als in den vorherigen Preview-Versionen von .NET 8.0 ist im .NET-basierten Webserver Kestrel das Protokoll HTTP/3 nicht mehr der Standard, sondern wieder – wie in .NET 7.0 – HTTP/2. Microsoft begründet diesen Schritt im Blogeintrag zu ASP.NET Core 8.0 Release Candidate 1: "Wir sind zum .NET-7-Verhalten zurückgekehrt, da die Aktivierung von HTTP/3 dazu führte, dass einige Antivirensoftware beim Start einer App mit Debugging gefragt hat, ob der Netzwerkzugriff zulässig ist. Das ist keine gute Erfahrung, daher haben wir HTTP/3 standardmäßig deaktiviert, bis wir das Entwicklererlebnis verbessern können."

Entwicklerinnen und Entwickler können aber HTTP/3 selbst im Programmcode aktivieren:

listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;

Entity Framework Core 8.0 (von Microsoft neuerdings abgekürzt als EF8) bietet ab Release Candidate 1 die schon seit einigen Versionen angekündigten, aber nie realisierten "Value Objects". Diese setzt Microsoft nun mit sogenannten "Complex Types" um – ähnlich wie im klassischen ADO.NET Entity Framework.

Complex Types in Entity Framework Core 8.0 sind .NET-Klassen oder .NET-Strukturen, die nicht auf eigenständige Tabellen abgebildet werden, sondern zu Spalten in der Tabelle für die Entitätsklasse werden. Das gab es bisher schon mit Owned Types. Complex Types brauchen aber im Gegensatz zu Owned Types keine Schlüsselspalte.

Für die Zukunft verrät Blogbeitragsautor Arthur Vickers: "Wir planen nicht, die Zuordnung komplexer Typen zu einer eigenen Tabelle zuzulassen. Wir planen jedoch, in einer zukünftigen Version die Speicherung des komplexen Typs als JSON-Dokument in einer einzelnen Spalte zu ermöglichen."

Komplexe Typen werden nicht automatisch per Konvention definiert, sondern müssen via Annotation [ComplexType] (siehe Listing 1) oder Fluent-API per Methodenaufruf ComplexProperty() explizit festgelegt werden:

  modelBuilder.Entity<Company>(x =>
  {
   x.ComplexProperty(p => p.Address);
  });

Abbildung 2 zeigt die aus den vier Klassen in Listing 1 resultierenden beiden Datenbanktabellen: Alle Spalten der Klasse Address sind Teil der Tabelle "Company", weil die Klasse mit [ComplexType] annotiert ist.

public abstract class Company
{
 public int CompanyID { get; set; } // Primary Key
 [StringLength(50)]
 public string Name { get; set; }

 [Required]
 public Address Address { get; set; }
 public List<Management> ManagementSet { get; set; } = new();
}

[ComplexType]
public class Address
{
 [StringLength(50)]
 public string City { get; set; }
 [StringLength(50)]
 public string Street { get; set; }
 [StringLength(10)]
 public string Postcode { get; set; }
 [StringLength(50)]
 public string Country { get; set; }
}

public class Management
{
 public int ID { get; set; } 
 public int CompanyId { get; set; } 


 public string Name { get; set; }
 public string Role { get; set; }
 public string[] Topics { get; set; } 
}

public class LimitedLiabilityCompany : Company
{
 [Required]
 [MaxLength(100)]
 public string CommercialRegister { get; set; }
 [Required]
 [MaxLength(50)]
 public string CommercialRegisterID { get; set; }
}

Listing 1: Die Klasse "Company" besitzt einen Complex Type "Address"

Diese beiden Tabellen entstehen aus den vier Klassen in Listing 1 (Abb. 2).

Objekte, die als Complex Types angelegt sind, lassen sich in Abfragen und Projektionen verwenden, z. B.

List<Company> allCompaniesInDortmund = ctx.Company.Where(c =>
c.Address.City.StartsWith("Dortmund")).ToList();

und

List<Address> allAddressesInDortmund = ctx.Company.Where(c =>
c.Address.City.StartsWith("Dortmund")).Select(x=>x.Address).ToList();

Komplexe Typen lassen sich auch ändern: Entity Framework Core persistiert nur die tatsächlich geänderten Spalten. So führt

c1.Address.City = "Dortmund";
ctx.SaveChanges();

zu:

UPDATE "Company" SET "Address_City" = @p0
WHERE "CompanyID" = @p1
RETURNING 1;

Auch unveränderbare Record-Typen (record class und record struct) sind als Complex Type möglich, einschließlich Neukonstruktion auf Basis bestehender Daten via C#-Schlüsselwort with:

c1.Address = c1.Address with { City = "Dortmund" };

Auch dann noch werden nur die geänderten Spalten zur Datenbank gesendet. Eine Verschachtelung komplexer Typen ist auch möglich.

Zu den aktuell noch vorhandenen Beschränkungen der komplexen Typen gehört, dass sie nicht den Wert null annehmen können (und daher mit dem C#-Schlüsselwort required, per Annotation [Required] oder via Fluent-API als IsRequired() definiert sein müssen), da es sich nicht um Objektmengen handeln darf (ein Versuch, die Klasse Management in Listing 1 mit [ComplexType] zu versehen, führt zum Laufzeitfehler "Adding the collection complex property Company.ManagementSet isn't supported") und ein Mapping auf JSON-Spalten nicht möglich ist. Zudem funktionieren sie nicht mit dem Cosmos-DB- und dem In-Memory-Treiber. Auch lassen sich in der OnModelCreating()-Methode keine konkreten Werte im Rahmen des Data Seeding festlegen.

Microsoft listet im Plan für Entity Framework Core 8.0 eigentlich noch weitere größere Neuerungen: Dazu gehören Trimming (Tree Shaking) und AOT mit Entity Framework Core, ein neuer, schnellerer SQL-Server-Datenbanktreiber und Verbesserungen für Entity Framework Core in der Entwicklungsumgebung Visual Studio. Ein Satz im Blogeintrag deutet aber darauf hin, dass erneut Einiges auf die nächste Version verschoben wird: "EF8 RC1 enthält alle wichtigen Funktionen, die wir in EF8 bereitstellen möchten, obwohl für RC2 weitere Optimierungen und Fehlerbehebungen folgen." Bereits in der Vergangenheit gab es im Entity-Framework-Core-Entwicklungsteam aus Personalmangel viele Verzögerungen.

.NET 8.0 Release Candidate 1 bringt abermals kleine Verbesserungen für den JSON-Serializer.

In .NET MAUI gibt es wieder zahlreiche Qualitätsverbesserungen (siehe eigener Blogeintrag). Zudem arbeitet .NET MAUI nun mit Xcode-Version 15 ab dessen Beta 6 zusammen.

.NET 8.0 Release Candidate 1 steht für jedermann kostenfrei zum Download bereit. Während der Blogeintrag sich zum Thema "Go-Live"-Lizenz ausschweigt, findet man auf der Download-Seite das "Go-Live"-Symbol mit dem Tooltip-Text (siehe Abbildung 2): "Go-Live-Releases werden von Microsoft in der Produktion unterstützt. Dies sind in der Regel unsere Release Candidate Builds, kurz vor der allgemein verfügbaren (GA) Veröffentlichung." In den letzten Jahren war es immer üblich, dass ab Release Candidate 1 der produktive Einsatz neuerer .NET-Versionen erlaubt ist – was Microsoft freilich nicht daran hindert, noch Änderungen an Programmierschnittstellen und dem Verhalten bis zum endgültigen Erscheinungstermin vorzunehmen.

Download-Übersicht zum modernen .NET (Abb. 3).

(Bild: Microsoft)

Eine neue Visual-Studio-Version ist nicht zeitglich mit .NET 8.0 RC1 erschienen. Man verwendet wie bei Preview 7 die Version 2022 17.8 Preview 1.

Als Erscheinungstermin für das fertige .NET 8.0 ist der 14. November 2023, der erste Tag der virtuellen Konferenz .NET Conf 2023, angekündigt. Vorher wird es im Oktober noch eine weitere Release-Candidate-Version geben.

Die Veranstalter iX, dpunkt.verlag und die .NET-Experten von www.IT-Visions.de werden dem deutschsprachigen Publikum den fertigen Stand von .NET 8.0 am 21. November 2023 im Rahmen der Online-Konferenz betterCode() .NET 8.0 präsentieren.

(mai)