EF Core 2.2 中的新增功能

空间数据支持

空间数据可用于表示对象的物理位置和形状。 许多数据库都可以本机存储、索引和查询空间数据。 常见方案包括,查询给定距离内的对象,以及测试多边形是否包含给定位置。 EF Core 2.2 现在支持使用 NetTopologySuite (NTS) 库中的类型,处理各种数据库中的空间数据。

空间数据支持是作为一系列提供程序专用扩展包进行实现。 每个包都为 NTS 类型和方法以及数据库中相应的空间类型和函数提供映射。 此类提供程序扩展现在可用于 SQL ServerSQLitePostgreSQL(来自 Npgsql 项目)。 空间类型可以直接与 EF Core 内存中提供程序一起使用,无需使用额外扩展。

安装提供程序扩展后,便能向实体添加受支持类型的属性。 例如:

using NetTopologySuite.Geometries;

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

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

然后,可以暂留包含空间数据的实体:

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

还可以根据空间数据和操作执行数据库查询:

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

若要详细了解此功能,请参阅空间类型文档

从属实体集合

EF Core 2.0 增加了在一对一关联中对所有权进行建模的功能。 EF Core 2.2 将此功能扩展为,将所有权表达为一对多关联。 所有权有助于约束实体的使用方式。

例如,从属实体:

  • 只能出现在其他实体类型的导航属性中。
  • 自动加载,并且只能被 DbContext 和所有者跟踪。

在关系数据库中,从属集合映射到所有者的各个表,就像是常规的一对多关联一样。 不过,在面向文档的数据库中,我们计划将(从属集合或引用中的)从属实体与所有者嵌套在同一个文档中。

若要使用此功能,可以调用新增的 OwnsMany() API:

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

有关详细信息,请参阅更新后的从属实体文档

查询标记

此功能简化了将代码中的 LINQ 查询与日志中捕获的已生成 SQL 查询相关联的过程。

若要利用查询标记,请使用新增的 TagWith() 方法对 LINQ 查询进行批注。 使用上一示例中的空间查询:

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 is my spatial query!

SELECT TOP(@__p_1) [f].[Name], [f].[Location]
FROM [Friends] AS [f]
ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC

有关详细信息,请参阅查询标记文档