Новые возможности в EF Core 2.2New features in EF Core 2.2

Поддержка пространственных данныхSpatial data support

Пространственные данные могут использоваться для представления физического расположения и формы объектов.Spatial data can be used to represent the physical location and shape of objects. Многие базы данных имеют собственную поддержку хранения и индексирования пространственных данных, а также запросов к ним.Many databases can natively store, index, and query spatial data. Типичные сценарии использования включают запросы о наличии объектов в пределах указанного расстояния или для проверки того, содержит ли многоугольник указанное расположение.Common scenarios include querying for objects within a given distance, and testing if a polygon contains a given location. Теперь EF Core 2.2 поддерживает работу с пространственными данными в различных базах данных, используя типы из библиотеки NetTopologySuite.EF Core 2.2 now supports working with spatial data from various databases using types from the NetTopologySuite (NTS) library.

Поддержка пространственных данных реализована в виде набора пакетов расширений для конкретных поставщиков.Spatial data support is implemented as a series of provider-specific extension packages. Каждый из этих пакетов содержит сопоставления для типов и методов NTS с соответствующими пространственными типами и функциями в базе данных.Each of these packages contributes mappings for NTS types and methods, and the corresponding spatial types and functions in the database. Эти расширения доступны для поставщиков баз данных SQL Server, SQLite и PostgreSQL (из проекта Npgsql).Such provider extensions are now available for SQL Server, SQLite, and PostgreSQL (from the Npgsql project). Пространственные типы можно использовать непосредственно с поставщиком EF Core для выполняющейся в памяти базы данных без дополнительных расширений.Spatial types can be used directly with the EF Core in-memory provider without additional extensions.

После установки расширения для поставщика можно добавлять к сущностям свойства поддерживаемых типов.Once the provider extension is installed, you can add properties of supported types to your entities. Пример:For example:

using NetTopologySuite.Geometries;

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

Затем можно сохранить сущности с пространственными данными: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();
}

Вы можете выполнять запросы к базе денных на основе пространственных данных и операций с ними: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();

Дополнительные сведения об этой возможности см. в документации по пространственному типу.For more information on this feature, see the spatial types documentation.

Коллекции сущностей с владельцемCollections of owned entities

В EF Core 2.0 добавлена возможность для моделирования владения в связях "один к одному".EF Core 2.0 added the ability to model ownership in one-to-one associations. В EF Core 2.2 эта возможность расширена и позволяет выражать владение в связях "один ко многим".EF Core 2.2 extends the ability to express ownership to one-to-many associations. Владение позволяет установить ограничения на использование сущностей.Ownership helps constrain how entities are used.

Например, сущности с владельцем:For example, owned entities:

  • могут отображаться только в свойствах навигации для других типов сущностей;Can only ever appear on navigation properties of other entity types.
  • загружаются автоматически и отслеживаются только с помощью DbContext вместе с владельцем.Are automatically loaded, and can only be tracked by a DbContext alongside their owner.

В реляционных базах данных коллекции с владельцем сопоставляются с таблицами, отдельными от владельца, как и в случае обычных связей "один ко многим".In relational databases, owned collections are mapped to separate tables from the owner, just like regular one-to-many associations. Но в базах данных, ориентированных на документы, мы планируем реализовать поддержку вложенных сущностей (в коллекциях с владельцем или ссылках) в том же документе, являющемся владельцем.But in document-oriented databases, we plan to nest owned entities (in owned collections or references) within the same document as the owner.

Эту возможность можно использовать, вызвав новый API OwnsMany():You can use the feature by calling the new OwnsMany() API:

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

Дополнительные сведения см. в обновленной документации по сущностям с владельцем.For more information, see the updated owned entities documentation.

Теги запросовQuery tags

Эта функция упрощает сопоставление запросов LINQ в коде со сгенерированными запросами SQL, зарегистрированными в журналах.This feature simplifies the correlation of LINQ queries in code with generated SQL queries captured in logs.

Чтобы воспользоваться преимуществами тегов запросов, можно пометить запрос LINQ с помощью нового метода TagWith().To take advantage of query tags, you annotate a LINQ query using the new TagWith() method. Использование пространственного запроса из предыдущего примера: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();

Запрос LINQ будет преобразован в следующий запрос SQL: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

Дополнительные сведения см. в документации по тегам запросов.For more information, see the query tags documentation.