Neue Features in EF Core 2.2

Unterstützung räumlicher Daten

Räumliche Daten können verwendet werden, um die physische Position und die Form von Objekten darzustellen. Viele Datenbanken können räumliche Daten nativ speichern, indizieren und abfragen. Häufige Szenarien sind das Abfragen von Objekten mit einer bestimmten Distanz und das Testen, ob ein Polygon eine bestimmte Position enthält. EF Core 2.2 unterstützt nun das Arbeiten mit räumlichen Daten aus verschiedenen Datenbanken mit Typen aus der NetTopologySuite-Bibliothek (NTS-Bibliothek).

Die Unterstützung räumlicher Daten wird als eine Reihe von anbieterspezifischen Erweiterungspaketen implementiert. Jedes dieser Pakete stellt Mappings für NTS-Typen und -Methoden sowie die entsprechenden räumlichen Typen und Funktionen in der Datenbank bereit. Diese Anbietererweiterungen sind nun für SQL Server, SQLite und PostgreSQL (aus dem Npgsql-Projekt) verfügbar. Räumliche Typen können direkt mit dem EF Core-In-Memory-Anbieter ohne zusätzliche Erweiterungen verwendet werden.

Wenn die Anbietererweiterung installiert ist, können Sie Ihren Entitäten Eigenschaften der unterstützten Typen hinzufügen. Beispiel:

using NetTopologySuite.Geometries;

namespace MyApp
{
  public class Friend
  {
    [Key]
    public string Name { get; set; }

    [Required]
    public Point Location { get; set; }
  }
}

Dann können Entitäten neben räumlichen Daten bestehen:

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

Außerdem können Sie Datenbankabfragen auf Grundlage von räumlichen Daten und Vorgängen ausführen:

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

Weitere Informationen zu diesem Feature finden Sie in der Dokumentation über räumliche Typen.

Sammlungen von nicht eigenständigen Entitäten

EF Core 2.0 bietet nun die Option, die Eigentümerschaft in 1:1-Zuordnungen zu modellieren. EF Core 2.2 erweitert die Funktion, die Eigentümerschaft in 1:n-Zuordnungen auszudrücken. Besitzer können einschränken, wie Entitäten verwendet werden.

Nicht eigenständige Entitäten:

  • Können immer nur in Navigationseigenschaften anderer Entitätstypen angezeigt werden
  • Werden automatisch geladen und können nur von einem „DbContext“-Objekt vom Besitzer verfolgt werden

In relationalen Datenbanken werden Sammlungen mit Besitzern separaten Tabellen des Besitzers zugeordnet, wie normale 1:n-Zuordnungen. Für dokumentorientierte Datenbanken planen wir jedoch eine Schachtelung nicht eigenständiger Entitäten (in nicht eigenständigen Sammlungen oder Referenzen) innerhalb des dem Besitzer zugeordneten Dokuments.

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 aktualisierten Dokumentation über nicht eigenständige Entitäten.

Abfragetags

Diese Funktion vereinfacht das Korrelieren zwischen LINQ-Abfragen im Code und generierten SQL-Abfragen, die in Protokollen erfasst werden.

Kommentieren Sie eine LINQ-Abfrage mit der neuen TagWith()-Methode, um Abfragetags zu verwenden. So sieht die Verwendung der Abfrage nach räumlichen Daten aus einem vorherigen Beispiel aus:

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

Diese LINQ-Abfrage erzeugt die folgende SQL-Ausgabe:

-- 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

Weitere Informationen finden Sie in der Dokumentation über Abfragetags.