Neue Features in EF Core 2.2New features in EF Core 2.2

Unterstützung räumlicher DatenSpatial data support

Räumliche Daten können verwendet werden, um die physische Position und die Form von Objekten darzustellen.Spatial data can be used to represent the physical location and shape of objects. Viele Datenbanken können räumliche Daten nativ speichern, indizieren und abfragen.Many databases can natively store, index, and query spatial data. Häufige Szenarien sind das Abfragen von Objekten mit einer bestimmten Distanz und das Testen, ob ein Polygon eine bestimmte Position enthält.Common scenarios include querying for objects within a given distance, and testing if a polygon contains a given location. EF Core 2.2 unterstützt nun das Arbeiten mit räumlichen Daten aus verschiedenen Datenbanken mit Typen aus der NetTopologySuite-Bibliothek (NTS-Bibliothek).EF Core 2.2 now supports working with spatial data from various databases using types from the NetTopologySuite (NTS) library.

Die Unterstützung räumlicher Daten wird als eine Reihe von anbieterspezifischen Erweiterungspaketen implementiert.Spatial data support is implemented as a series of provider-specific extension packages. Jedes dieser Pakete stellt Mappings für NTS-Typen und -Methoden sowie die entsprechenden räumlichen Typen und Funktionen in der Datenbank bereit.Each of these packages contributes mappings for NTS types and methods, and the corresponding spatial types and functions in the database. Diese Anbietererweiterungen sind nun für SQL Server, SQLite und PostgreSQL (aus dem Npgsql-Projekt) verfügbar.Such provider extensions are now available for SQL Server, SQLite, and PostgreSQL (from the Npgsql project). Räumliche Typen können direkt mit dem EF Core-In-Memory-Anbieter ohne zusätzliche Erweiterungen verwendet werden.Spatial types can be used directly with the EF Core in-memory provider without additional extensions.

Wenn die Anbietererweiterung installiert ist, können Sie Ihren Entitäten Eigenschaften der unterstützten Typen hinzufügen.Once the provider extension is installed, you can add properties of supported types to your entities. Zum Beispiel:For example:

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:You can then persist entities with spatial data:

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:And you can execute database queries based on spatial data and operations:

  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.For more information on this feature, see the spatial types documentation.

Sammlungen von nicht eigenständigen EntitätenCollections of owned entities

EF Core 2.0 bietet nun die Option, die Eigentümerschaft in 1:1-Zuordnungen zu modellieren.EF Core 2.0 added the ability to model ownership in one-to-one associations. EF Core 2.2 erweitert die Funktion, die Eigentümerschaft in 1:n-Zuordnungen auszudrücken.EF Core 2.2 extends the ability to express ownership to one-to-many associations. Besitzer können einschränken, wie Entitäten verwendet werden.Ownership helps constrain how entities are used.

Nicht eigenständige Entitäten:For example, owned entities:

  • Können immer nur in Navigationseigenschaften anderer Entitätstypen angezeigt werdenCan only ever appear on navigation properties of other entity types.
  • Werden automatisch geladen und können nur von einem „DbContext“-Objekt vom Besitzer verfolgt werdenAre automatically loaded, and can only be tracked by a DbContext alongside their owner.

In relationalen Datenbanken werden Sammlungen mit Besitzern separaten Tabellen des Besitzers zugeordnet, wie normale 1:n-Zuordnungen.In relational databases, owned collections are mapped to separate tables from the owner, just like regular one-to-many associations. 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.But in document-oriented databases, we plan to nest owned entities (in owned collections or references) within the same document as the owner.

Sie können die Funktion verwenden, indem Sie die neue OwnsMany()-API aufrufen:You can use the feature by calling the new OwnsMany() API:

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

Weitere Informationen finden Sie in der aktualisierten Dokumentation über nicht eigenständige Entitäten.For more information, see the updated owned entities documentation.

AbfragetagsQuery tags

Diese Funktion vereinfacht das Korrelieren zwischen LINQ-Abfragen im Code und generierten SQL-Abfragen, die in Protokollen erfasst werden.This feature simplifies the correlation of LINQ queries in code with generated SQL queries captured in logs.

Kommentieren Sie eine LINQ-Abfrage mit der neuen TagWith()-Methode, um Abfragetags zu verwenden.To take advantage of query tags, you annotate a LINQ query using the new TagWith() method. So sieht die Verwendung der Abfrage nach räumlichen Daten aus einem vorherigen Beispiel aus:Using the spatial query from a previous example:

  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 LINQ query will produce the following SQL output:

-- 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.For more information, see the query tags documentation.