Entity Framework Core 2.2 veröffentlicht. Was gibt's Neues? (3 von 3)

Am 4. Dezember wurde die endgültige Version von EF Core 2.2 veröffentlicht. Es wurde parallel zu ASP.NET Core 2.2 und .NET Core 2.2 veröffentlicht und ist die neueste Version unserer Open Source- und plattformübergreifenden Technologie zur Verwaltung von Zuordnungen zwischen Sprachobjekten und einer Datenbank.


EF Core 2.2 RTM enthält mehr als hundert Korrekturen und einige neue Funktionen, über die wir in diesem Artikel sprechen werden.


Links führen zu entsprechenden Artikeln über Habré. Dies ist der letzte, dritte Artikel der Reihe. Nächstes Mal werden wir über eine neue Version sprechen - und das wird im neuen Jahr sein.



Geodaten


Geodaten werden verwendet, um den physischen Standort und die Form von Objekten zu speichern. In vielen vorhandenen Datenbanken sind Methoden zum Speichern, Indizieren und Abrufen solcher Daten integriert. Die Hauptverwendungsszenarien bestehen darin, nach Objekten in einer ausgewählten Entfernung zu suchen und zu überprüfen, ob einige der Polygone einen bestimmten Punkt enthalten. EF Core 2.2 kann nun mit solchen Datenbanken und Geodaten in ihnen arbeiten und Typen aus der NetTopologySuite (NTS) -Bibliothek verwenden.


Geodaten werden als Sätze von Erweiterungspaketen für spezielle Anbieter implementiert. Jedes dieser Pakete fügt sowohl neue Zuordnungen für NTS-Typen und -Methoden als auch die entsprechenden räumlichen Typen und Funktionen in der Datenbank hinzu. Solche Anbietererweiterungen wurden bereits für SQL Server, SQLite und PostgreSQL implementiert (dank des Npgsql-Projekts). Räumliche Typen können direkt zusammen mit dem In-Memory-Anbieter EF Core verwendet werden, ohne dass andere Erweiterungen verwendet werden müssen.


Sobald die Erweiterung installiert ist, werden neue Typen unterstützt. Eigenschaften mit diesen Typen können in ihren Entitäten verwendet werden, zum Beispiel:


using NetTopologySuite.Geometries; namespace MyApp { public class Friend { [Key] public string Name { get; set; } [Required] public Point Location { get; set; } } } 

Natürlich können Sie jetzt diese Daten speichern:


 using (var context = new MyDbContext()) { context.Add( new Friend { Name = "Bill", Location = new Point(-122.34877, 47.6233355) {SRID = 4326 } }); context.SaveChanges(); } 

In ähnlicher Weise wird es möglich, Abfragen an die Datenbank zu stellen, die räumliche Daten und Operationen beinhalten:


  var nearestFriends = (from f in context.Friends orderby f.Location.Distance(myLocation) descending select f).Take(5).ToList(); 

Geodaten sind ein großes Thema, mit dem Sie mit der offiziellen Dokumentation beginnen sollten .


Sammlungen abhängiger Einheiten


EF Core 2.0 bietet die Möglichkeit, Eins-zu-Eins-Beziehungen zu modellieren. EF Core 2.2 erweitert diese Funktion um die Möglichkeit, direkt anzugeben, wer in dieser Hinsicht die Hauptentität (Eigentümer) und wer abhängig (Eigentümer) ist. Auf diese Weise können Sie den Umfang der Entität einschränken und klarstellen.


Zum Beispiel abhängige Entitäten:


  • Sie können nur in Referenzeigenschaften ( englische „Navigationseigenschaft“ ) verwendet werden, die in anderen Entitätstypen enthalten sind.
  • DbContext in DbContext nur zusammen mit seiner Hauptentität automatisch geladen und verfolgt.

In relationalen Datenbanken werden abhängige Sammlungen nicht in der Tabelle der Hauptentität angezeigt, sondern in separaten Tabellen, ähnlich den üblichen Eins-zu-Viele-Beziehungen. In dokumentenorientierten Datenbanken ist alles etwas anders, und wir planen, abhängige Entitäten (in abhängigen Sammlungen oder Links) in dasselbe Dokument einzubetten, in dem die Hauptentität gespeichert ist.


Sie können die Funktion verwenden, indem Sie die neue OwnsMany() API aufrufen:


 modelBuilder.Entity<Customer>().OwnsMany(c => c.Addresses); 

Weitere Informationen finden Sie in der Dokumentation .


Tags abfragen


Diese Funktion soll das Auffinden einer Verbindung zwischen LINQ-Abfragen im Code und daraus generierten SQL-Abfragen, die in den Protokollen enthalten sind, vereinfachen.


Kommentieren Sie zum Aktivieren von Tags die LINQ-Abfrage mit der neuen TagWith() -Methode. Lassen Sie uns das vorherige Beispiel aus dem Geodatenabschnitt ein wenig ändern:


  var nearestFriends = (from f in context.Friends.TagWith(@"This is my spatial query!") orderby f.Location.Distance(myLocation) descending select f).Take(5).ToList(); 

Sie können den folgenden Text im Protokoll sehen:


 -- This is my spatial query! SELECT TOP(@__p_1) [f].[Name], [f].[Location] FROM [Friends] AS [f] ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC 

Wie immer gibt es dazu einen [Abschnitt in der Dokumentation].


Kompatibel mit EF Core 2.1


Wir haben viel Zeit und Mühe aufgewendet, um die Abwärtskompatibilität von EF Core 2.2 mit bestehenden Anbietern von EF Core 2.1 sicherzustellen und sicherzustellen, dass die Anwendung nach dem Update auf EF Core 2.2 ohne sichtbare Probleme zusammengestellt wurde. In den meisten Fällen ist die Migration auf die neue Version höchstwahrscheinlich einfach. Wenn Sie jedoch plötzlich auf Probleme stoßen, sollten Sie in unserem Bugtracker darüber sprechen.


Derzeit gibt es nur eine Änderung, die möglicherweise geringfügige Änderungen am Anwendungscode erfordert. Sie können darüber in der Beschreibung des folgenden Tickets lesen:


  • # 13986 : Für einen Typ, der sowohl als reguläre als auch als abhängige Eigenschaft konfiguriert ist, muss unmittelbar nach dem Upgrade von 2.1 auf 2.2 ein Primärschlüssel erstellt werden.

Wir beabsichtigen, die Liste der Probleme, die eine Änderung des alten Codes erfordern, weiterhin zu pflegen und zu aktualisieren.


Was kommt als nächstes: EF Core 3.0


Nach der Veröffentlichung von Version 2.2 ist unser nächstes Ziel EF Core 3.0. Wir haben noch keine neuen Funktionen implementiert, daher enthalten die am 4. Dezember veröffentlichten NuGet-Pakete nur wenige kleine Änderungen, die nach der Veröffentlichung von EF Core 2.2 vorgenommen wurden.


Für die nächste Veröffentlichung sind bereits mehrere viel diskutierte große Ideen geplant. Wir möchten in zukünftigen Pressemitteilungen darüber sprechen, aber hier sind einige Themen, zu denen Sie bereits etwas sagen können:


  • Verbesserungen in LINQ . Mit LINQ können Sie Datenbankabfragen schreiben, ohne von Ihrer Primärsprache in die Datenbanksprache wechseln zu müssen. Verwenden Sie dazu Typinformationen, um IntelliSense anzuzeigen und zur Kompilierungszeit zu validieren. Dies bedeutet aber auch, dass Sie mit LINQ eine unbegrenzte Anzahl komplexer Abfragen schreiben können, was für LINQ-Anbieter schon immer eine echte Herausforderung war. In den ersten Versionen von EF Core haben wir dieses Problem gelöst, indem wir ermittelt haben, welche Teile der Anforderung in SQL übersetzt werden können, und dann den Rest der Anforderung mithilfe des Speichers dieses Clients direkt auf dem Client ausgeführt werden konnten. Diese clientseitige Ausführung kann manchmal nützlich sein, führt jedoch in vielen Fällen zu äußerst ineffizienten Anforderungen, die erst gefunden werden können, wenn der Code in Produktion geht. EF Core 3.0 möchte die LINQ-Interna gründlich ändern und testen. Es ist notwendig, sie langlebiger und zuverlässiger zu machen (damit beispielsweise Anforderungen nach dem Rolling neuer Patch-Releases nicht unterbrochen werden). Implementieren Sie die korrekte Übersetzung einer größeren Anzahl von Ausdrücken in SQL. Konzentrieren Sie sich darauf, Abfragen zu generieren, die in mehr Fällen effizienter arbeiten. zu berücksichtigen, dass ineffiziente Anfragen nicht unbemerkt bleiben.


  • Cosmos DB-Unterstützung . Wir arbeiten weiterhin am Cosmos DB-Anbieter für EF Core, damit Entwickler, die mit dem EF-Programmiermodell vertraut sind, sofort auf Azure Cosmos DB als Hauptbasis abzielen können. Die Herausforderung besteht darin, das Beste aus Cosmos DB herauszuholen, z. B. die globale Verteilung, die Verfügbarkeit "immer ein", die elastische Skalierbarkeit, die geringe Latenz usw. Der EF Core-Anbieter sollte die meisten verfügbaren Funktionen bereitstellen. Wir haben lange vor EF Core 2.2 damit begonnen und sogar einige vorläufige Versionen veröffentlicht . Wir werden den Anbieter parallel zu EF Core 3.0 weiterentwickeln.


  • Unterstützung für C # 8.0 . C # 8.0 verfügt über einige nützliche neue Funktionen wie asynchrone Streams (einschließlich await foreach ) und nullfähige Referenztypen, die von EF Core unterstützt werden.


  • Umkehren einer Datenbank in Abfragetypen . EF Core 2.1 bietet Unterstützung für Abfragetypen, die Daten darstellen, die aus der Datenbank gelesen, aber nicht aktualisiert werden können. Sie eignen sich hervorragend zum Modellieren von Ansichten in SQL-Datenbanken. Daher möchte EF Core 3.0 ihre Erstellung automatisieren.


  • Property Bag Entities . Dadurch werden Entitäten hinzugefügt, die Daten nicht in gewöhnlichen, sondern in indizierten Eigenschaften speichern und Instanzen derselben Klasse in .NET verwenden können (z. B. Dictionary<string, object> ), um viele verschiedene Arten von Entitäten in einer anzuzeigen und das gleiche EF Core-Modell. Diese Funktion ist der nächste Schritt auf dem Weg zu vollwertigen Viele-zu-Viele-Beziehungen ohne die Verwendung einheitlicher Entitäten - eine der am meisten erwarteten Funktionen von EF Core.


  • EF 6.3 unter .NET Core . Es ist klar, dass es mittlerweile viele Anwendungen gibt, die EF verwenden, und die Portierung auf EF Core, um einige Vorteile aus der Verwendung von .NET Core zu ziehen, erfordert manchmal viel Aufwand. Daher werden wir die nächste Version von EF 6 so anpassen, dass sie auch unter .NET Core 3.0 funktioniert. Dies soll Entwickler dazu ermutigen, ihre Anwendungen zu portieren, damit sie so wenig Code wie möglich ändern müssen. Dies führt natürlich zu einer Reihe von Einschränkungen (z. B. sind neue Anbieter erforderlich und die Unterstützung für Geodaten wird für SQL Server nicht aktiviert). Darüber hinaus planen wir, EF 6 keine zusätzlichen Funktionen hinzuzufügen.



Fazit


Das EF-Team dankt der Community für das hochwertige Feedback und die Entwicklungsunterstützung, die letztendlich zur Einführung von EF Core 2.2 geführt haben. Wie immer erinnern wir Sie daran, dass neues Ishshui direkt zu unserem Tracker hinzugefügt werden kann. Vielen Dank!


Vergessen Sie nicht, dass die Preise für Tickets für DotNext ab dem 1. Januar steigen werden. Persönlich - für tausend und Standard - für zweitausend. Details zu Early Bird finden Sie auf der Website .

Source: https://habr.com/ru/post/de433442/


All Articles