EF Core 2.2 中的新增功能
空间数据支持
空间数据可用于表示对象的物理位置和形状。 许多数据库都可以本机存储、索引和查询空间数据。 常见方案包括,查询给定距离内的对象,以及测试多边形是否包含给定位置。 EF Core 2.2 现在支持使用 NetTopologySuite (NTS) 库中的类型,处理各种数据库中的空间数据。
空间数据支持是作为一系列提供程序专用扩展包进行实现。 每个包都为 NTS 类型和方法以及数据库中相应的空间类型和函数提供映射。 此类提供程序扩展现在可用于 SQL Server、SQLite 和 PostgreSQL(来自 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
有关详细信息,请参阅查询标记文档。