EF Core 2.2 中的新增功能New features in EF Core 2.2

空间数据支持Spatial data support

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

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

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

  1. using NetTopologySuite.Geometries;
  2. namespace MyApp
  3. {
  4. public class Friend
  5. {
  6. [Key]
  7. public string Name { get; set; }
  8. [Required]
  9. public Point Location { get; set; }
  10. }
  11. }

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

  1. using (var context = new MyDbContext())
  2. {
  3. context.Add(
  4. new Friend
  5. {
  6. Name = "Bill",
  7. Location = new Point(-122.34877, 47.6233355) {SRID = 4326 }
  8. });
  9. context.SaveChanges();
  10. }

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

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

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

从属实体集合Collections of owned entities

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

例如,从属实体:

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

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

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

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

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

查询标记Query tags

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

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

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

此 LINQ 查询将生成以下 SQL 输出:

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

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