实体框架核心2.2发布。 最新消息 (3之3)

12月4日,EF Core 2.2的最终版本发布。 它与ASP.NET Core 2.2.NET Core 2.2并行发布,是用于管理语言对象和数据库之间映射的我们的开源和跨平台技术的最新版本。


EF Core 2.2 RTM包含一百多个修复程序和几个新功能,我们将在本文中进行讨论。


链接指向哈布雷的相应文章。 这是该系列的最后第三篇文章。 下次我们将讨论新版本-它将在新的一年。



空间数据


空间数据用于存储对象的物理位置和形状。 许多现有的数据库都有用于存储,索引和检索此类数据的内置方法。 主要的使用场景是在选定距离处搜索对象,并检查某些多边形是否包含给定点。 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扩展了此功能,可以直接指出在这方面谁是主要实体(所有者)以及谁是从属实体(拥有)。 这使您可以限制和阐明实体的范围。


例如,从属实体:


  • 它们只能用于其他类型的实体中包含的参考属性( 英文为“ navigation property” )中;
  • 仅在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(); 

您可以在日志中看到以下文本:


 -- 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 

与往常一样,有一个[文档中的章节]。


与EF Core 2.1兼容


我们花费了大量时间和精力来确保EF Core 2.2与EF Core 2.1的现有提供程序的向后兼容性,并确保将其更新到EF Core 2.2之后就可以正确地组装应用程序。 在大多数情况下,很可能会很容易地迁移到新版本,但是尽管如此,如果您突然遇到问题,还是值得在我们的bugtracker中进行讨论


目前,只有一项更改可能需要对应用程序代码进行少量更改。 您可以在以下票证的描述中了解它:


  • #13986 :既配置为常规属性又配置为从属属性的类型,要求从2.1升级到2.2后立即创建主键。

我们打算继续维护和更新需要修改旧代码的问题列表


下一步:EF Core 3.0


在2.2版发布之后,我们的下一个目标是EF Core 3.0。 我们尚未实现任何新功能,因此12月4日发布的NuGet软件包仅包含EF Core 2.2发行后进行的一些小更改


对于下一个版本,已经计划了一些广泛讨论的大创意。 我们想在以后的新闻发布中谈论它们,但是这里有一些您已经可以说出一些话的话题:


  • LINQ的改进 。 LINQ允许您使用类型信息显示IntelliSense并在编译时进行验证,而无需从主要语言切换为数据库语言来编写数据库查询。 但这也意味着LINQ允许您编写无限数量的复杂查询,这对于LINQ提供程序始终是一个真正的挑战。 在EF Core的第一个版本中,我们通过确定请求的哪些部分可以转换为SQL,然后允许使用该客户端的内存直接在客户端上执行其余请求,来解决此问题。 这种客户端执行有时会很有用,但在许多情况下会导致效率极低的请求,这些请求只有在代码投入生产后才能找到。 EF Core 3.0希望彻底改变LINQ内部结构以及如何对其进行测试。 有必要使它们更加耐用和可靠(例如,以便在滚动新补丁发布后请求不会中断); 在SQL中实现大量表达式的正确翻译; 专注于生成在更多情况下更有效地工作的查询; 考虑到效率低下的请求不会被忽视。


  • Cosmos DB支持 。 我们将继续为EF Core提供Cosmos DB提供程序,以便熟悉EF编程模型的开发人员可以立即将Azure Cosmos DB作为主要基础。 面临的挑战是如何利用Cosmos DB中的最佳资源,例如全球分布,“始终在线”可用性,弹性可伸缩性,低延迟等。 EF Core提供程序应提供大多数可用功能。 我们早在EF Core 2.2之前就开始这样做,甚至发布了一些初步版本 。 我们将继续与EF Core 3.0并行开发提供程序。


  • 支持C#8.0 。 C#8.0具有一些有用的新功能,例如异步流(包括await foreach )和EF Core支持的可为空的引用类型。


  • 将数据库反转为查询类型 。 EF Core 2.1增加了对查询类型的支持,这些查询类型表示可以从数据库读取但无法更新的数据。 它们非常适合在SQL数据库中为视图建模,因此EF Core 3.0希望自动化其创建。


  • 财产袋实体 。 这会添加实体,这些实体不是在普通属性中而是在索引属性中存储数据,并且可以使用.NET中同一类的实例(例如,诸如Dictionary<string, object>类的东西)在一个实体中显示许多不同类型的实体。和相同的EF Core模型。 此功能是在不使用统一实体的情况下通往成熟的多对多关系的下一步,这是EF Core最令人期待的功能之一。


  • .NET Core上的EF 6.3 。 显而易见,现在有许多使用EF的应用程序,将它们移植到EF Core只是为了从使用.NET Core获得一些好处,有时需要付出很多努力。 因此,我们将适应EF 6的下一个版本,以便它也可以在.NET Core 3.0上开始工作。 这是为了鼓励开发人员移植其应用程序,以便他们必须更改尽可能少的代码。 当然,这将导致许多限制(例如,将需要新的提供程序,并且不会为SQL Server启用空间数据支持)。 此外,我们不打算向EF 6添加任何其他功能。



结论


EF团队感谢社区的质量反馈和开发帮助,最终促成了EF Core 2.2的引入。 与往常一样,我们提醒您可以将新的水直接添加到我们的跟踪器中 。 谢谢你


不要忘记,从1月1日开始的DotNext门票价格会上涨。 个人-一千,标准-两千。 有关Early Bird的详细信息在网站上

Source: https://habr.com/ru/post/zh-CN433442/


All Articles