5 月初,.NET 团队发布了一个 Core 2.0 实体框架的预览版本,这是 EF 对于 .NET Core 和 .NET Framework 的轻量级、可扩展和跨平台的版本。
5 月 23 日,Entity Framework runtime 和相应的 Visual Studio 工具的 6.2 beta 版本已经可用了。EF 6.2 是 Microsoft 更传统的对象/.NET Framework 关系映射器的新迭代。
将应用程序升级到 EF 6.2 beta 1 runtime
通常情况下,NuGet 会提供 EF 6 runtime 的预发行版本。在 Visual Studio 中,可以通过“Manage NuGet Packages”窗口(确保“Include prerelease”选项被选中)或“Package Manager Console”中的 NuGet 命令,实现应用程序中 EF 软件包的安装或更新。
例如,更新现有项目中的 beta 包:
PM> Update-Package EntityFramework -Version 6.2.0-beta1 -Pre
在新项目中安装 beta 包:
PM> Install-Package EntityFramework -Version 6.2.0-beta1 -Pre
升级 Visual Studio 中的 EF 工具
用户可以从 Microsoft 下载中心获取安装程序。只需要下载并安装与正在使用的 Visual Studio 版本对应的文件即可。
目前支持 Visual Studio 2012、2013 和 2015。请注意,目前并没有为 Visual Studio 2017 提供测试版的 EF 工具。因为 Visual Studio2017 需要使用不同的机制来将更新分发给 EF 工具这样的组件,.NET 团队计划稍后提供更新日期。
EF 工具的大部分代码是跨 Visual Studio 版本共享的,因此任何版本的测试都有助于验证 beta 版的质量。
如果用户只安装了 Visual Studio 2017,仍然可以将应用程序升级到使用 6.2 Beta 1 版本的 EF runtime,同时继续使用 Visual Studio 中包含的 EF 工具。
降低 Visual Studio 中的 EF 工具
当用户安装此测试版时,它会替换掉 Visual Studio 中包含的工具或安装的任何先前版本。如果用户在使用此测试版过程中,遇到任何问题, Visual Studio 附带的工具可以将工具还原到之前的版本。可以按照以下步骤进行操作:
-
使用“添加/删除程序”,卸载 Visual Studio 的实体框架工具
-
修复 Visual Studio 安装
EF 6.2 beta 1 中有什么新功能?
虽然 EF 团队的重点工作是为 EF Core 增加新功能和改进,但是也计划继续修复一些重要 bug,实施小型改进,并接受社区对 EF 6 代码库的贡献。
社区的开源贡献者为 EF 6.2 beta 1 版本的许多提升做出的巨大贡献,在此表示感谢。此版本的完整列表(包括即将推出的 PowerTools 版本中的错误修复)可在 GitHub query 中找到。
新功能中值得一提的有以下几点:
-
通过从永久缓存#275 中加载第一个模型的完成代码来减少启动时间
可以通过将以下代码加入到应用中来实现该功能:
using System.Data.Entity; using System.Data.Entity.Infrastructure; namespace MyApplication { public class MyDbConfiguration : DbConfiguration { public MyDbConfiguration () : base() { this.SetModelStore (new DefaultDbModelStore (Directory.GetCurrentDirectory ())); } } }
-
提供程序报告无效键时 EF 工具更新模型的问题#243
在某些数据库逆向工程场景中,某些提供程序可能会错误地指示主键列为空。EF 工具不再将其报告为错误,而是会忽略不正确的可空性。
-
添加 DbFunctions.Like(),使得可以在 SQL 中编写转换为 LIKE 的 LINQ 查询#241
用法如下:
var query = db.People.Where(p=> DbFunctions.Like(p.Name,“w%”));
-
Migrate.exe 支持 support -选项#240
启用使用命令行工具生成用于迁移的 SQL 脚本。
-
使用参数过多时,从数据库更新大型模型可能导致 sp_executesql 失败#185
这是与 SQL Server 大数据模型配合使用的长期问题。有关详细信息,请参阅“Call to action for provider writers”。
-
EF6 不能与序列主键一起使用#165
现在可以采用与序列兼容的机制,在 runtime 使用标志来更改 EF 检索插入 SQL Serer 的生成值:
-
更新 SQL Azure 执行策略错误号#83
将额外的错误纳入到临时性错误列表,以便能够根据客户反馈和 Azure SQL 数据库上的新数据进行恢复。
-
使用“The SqlParameter is already contained by another SqlParameterCollection”命令重试查询或 SQL 命令失败#81
在使用重试执行策略时,该问题会影响多个 API。
-
调试器中 DbQuery.ToString()的评估经常会超时#73
根据 Debugger 团队的建议,.NET 团队添加了一个新的 Sql 属性,以便在诸如 Autos,Locals 或 Watch 之类的调试窗口中 LINQ 查询被检查时使用。仍然可以使用`ToString()方法来获取 SQL,但调试器已经不会使用了。
为 provider 提供 Call to action
.NET 团队怀疑一些现有的 EF provider 可能会受到此版本中工具包含的修复的不利影响,因此请求 provider 的帮助来验证这一假设。
该修复程序解决了 EF 工具的“Update model from database”功能中使用模式发现查询长期存在的问题。对具有大量对象的数据库使用该功能时,模式发现查询可能会包含大量参数。特别是 SQL Server 对每个查询的参数限制为 2100,生成查询和参数的方式可能导致任何超过 300 个对象的模型失败。GitHub 问题更详细地描述了此问题:使用过多参数,从数据库更新大型模型可能导致 sp_executesql 失败#185。
有哪些改变
@bengutt 基于原有的想法并实现了这个修复程序,通过对每一个不同值使用重复利用参数对象,实现了模式发现查询所需参数的显著减少了。
该修复程序是在跨 provider 和所有当前和以前的 EF 版本中,使用共享代码实现的,这也可能会使非 SQL Server 的 provider 获益。因此希望尽可能多的 provider 使用此新版本。但是,如果对某些 provider 是破坏性的改变,那么将终止将 SQL Server 视作特殊案例的情况。
provider 会受到什么影响
任何利用 EF 查询功能来实现模式发现的 provider 都会受到影响。例如通过在数据库模式中提供自己的 SSDL 和 MSL 模型文件,只能受益于或不受参数数量的减少的影响。
然而,一些 provider 通过模式发现查询中的模式匹配来实现模式发现,然后将这些模式转化成原生模式发现 API 的调用。这样的提供者需要实现一些逻辑来将查询参数与查询中的过滤器相匹配。根据后一个实现方式的不同,如果参数的数量或顺序会随着修复程序改变,则可能会中断此参数。
如果你的 provider 因为修复而损坏,请报告
如果你的 provider 已损坏,请在 Call to action for provider writers: test compatibility with schema discovery queries in EF Tools 6.2 地 GitHub 问题下留言。#195
beta 1 之后是什么?
.NET 团队计划短期内在 EF 6 方面做下几件事情:
-
正在考虑使用 Visual Studio 2017 的兼容性来发布一个 EF 6 PowerTools 的更新。
-
一旦 .NET 团队收到并分析了 beta 版本的反馈,将决定是否需要发布另外一个预览版本,还是设定好 6.2 版本的最终发布日期。
-
如前所述,.NET 团队将在后续发布 Visual Studio 2017 的 EF 6.2 工具。
目前已有很多产品支持 EF,其中值得一提的是 ComponentOne,ComponentOne 基于 EF6 的版本能够帮助用户充分发掘 EF6 的潜力并使其在 WinForms 应用中更加易用。