针对 Entity Framework Core 5.0 的计划

重要

EF Core 5.0 现已发布。 此页面仍作为计划的历史记录。

规划过程中所述,我们已将利益干系人的意见收集到 EF Core 5.0 版本的暂定计划中。

重要

此计划仍在进行中。 这里没有什么是承诺。 此计划是一个起点,会随着我们了解更多信息而发展。 当前未针对 5.0 进行计划的某些内容可能会被纳入。 当前已针对 5.0 进行计划的某些内容可能会被淘汰。

常规信息

版本号和发布日期

EF Core 5.0 当前计划与 .NET 5.0 同时发布。 选择版本“5.0”以便与 .NET 5.0 保持一致。

支持的平台

EF Core 5.0 计划在任何 .NET Standard 2.1 平台上运行,包括 .NET 5.0。 这是更常见的 .NET 范围平台与 .NET Core 的聚合的一部分。

EF Core 5.0 不会在 .NET Framework 上运行。

重大更改

EF Core 5.0 将包含一些中断性变更,但与 EF Core 3.0 的情况相比,这些更改的严重性要小得多。 我们的目标是允许绝大多数应用程序在不中断的情况下进行更新。

预计会对数据库提供程序进行一些重大更改,尤其是在 TPT 支持方面。 但是,我们预计更新到 5.0 的提供程序所需的工作量将少于更新到 3.0 所需的工作量。

主题

我们提取了几个主要领域或主题,这些领域或主题将成为 EF Core 5.0 大型投资的基础。

以完全透明的方式按约定进行多对多映射

首席开发人员:@smitpatel、@AndriySvyryd和 @lajones

通过 #10508 进行跟踪

T 恤尺寸:L

状态:完成

多对多是 GitHub 积压工作 (backlog) 中请求最多的功能(大约 506 张投票)。

对多对多关系的支持可以分为三个主要领域:

  • 跳过下一主题涵盖的导航属性。
  • 属性包实体类型。 这些允许将标准 CLR 类型(例如 Dictionary)用于实体实例,以便每个实体类型不需要显式 CLR 类型。 通过 #9914 进行跟踪。
  • Sugar 可用于轻松配置多对多关系。

除了支持跳过导航,我们现还将多对多关系的这些其他方面引入到 EF Core 5.0 来提供完整的体验。

多对多导航属性(即“跳过导航”)

首席开发人员:@smitpatel 和 @AndriySvyryd

通过 #19003 进行跟踪

T 恤尺寸:L

状态:完成

如第一个主题中所述,多对多支持具有多个方面。 该主题专门跟踪对跳过导航功能的使用。 我们认为,对于需要多对多支持的人员而言,最重要的阻止因素是无法在业务逻辑(如查询)中使用“自然”关系,而无需引用联接表。 联接表实体类型可能仍然存在,但它不应妨碍业务逻辑。

每个类型一张表 (TPT) 继承映射

首席开发人员:@AndriySvyryd 和 @smitpatel

通过 #2266 进行跟踪

T 恤尺寸:XL

状态:完成

我们正在做 TPT,因为它既是一个高度请求的功能(约 289 票,总排名第三),而且因为它需要一些低级别的更改,我们认为这些更改适合 .NET 5 整体计划的基础性要求。 我们预计这将导致数据库提供程序的重大更改,但这些更改应该比 3.0 版本所需的更改要轻微得多。

经过筛选的包含

主开发人员:@maumar

通过 #1833 进行跟踪

T 恤大小:M

状态:完成

经过筛选的包含是经常请求的功能(大约 376 张投票;第二名),其工作量不大,我们认为这会使当前需要模型级筛选器或更复杂查询的许多方案不受阻碍或更加容易。

拆分包含

首席开发人员:@smitpatel

通过 #20892 进行跟踪

T 恤尺寸:L

状态:完成

EF Core 3.0 更改了默认行为,为给定的 LINQ 查询创建单个 SQL 查询。 这导致对对多个集合使用 Include 的查询出现较大的性能回归。

在 EF Core 5.0 中,我们将保留新的默认行为。 但是,EF Core 5.0 现在允许为集合的 `Include` 操作生成多个查询,以解决单个查询导致性能不佳的情况。

需要一对一依赖项

首席开发人员:@AndriySvyryd 和 @smitpatel

通过 #12100 进行跟踪

T 恤大小:M

状态:完成

在 EF Core 3.0 中,所有依赖项(包括拥有的类型)都是可选的(例如 Person.Address 可以为 null)。 在 EF Core 5.0 中,可以根据需要配置依赖项。

合理化 ToTable、ToQuery、ToView、FromSql 等

首席开发人员:@AndriySvyryd 和 @smitpatel

通过 #17270 进行跟踪

T 恤尺寸:L

状态:完成

我们在以前的版本中已取得进展,以支持原始 SQL、无键类型和相关领域。 然而,整体上各个部分协同工作的方式存在差距和不一致。 5.0 的目标是修复这些问题,并为定义、迁移和使用不同类型的实体及其关联的查询和数据库项目创造良好的体验。 这可能还涉及对已编译查询 API 的更新。

请注意,此项可能会导致某些应用程序级重大更改,因为我们当前拥有的某些功能过于宽松,以至于它可能很快导致人们陷入困境。 我们最终可能会阻止这些功能中的一些,并提供有关替代措施的指导。

常规查询增强功能

首席开发人员:@smitpatel 和 @maumar

通过 5.0 里程碑中使用 area-query 标记的问题进行跟踪

T 恤尺寸:XL

状态:完成

查询转换代码已针对 EF Core 3.0 进行了广泛重写。 因此,查询代码通常处于更可靠的状态。 对于 5.0 除了支持 TPT 和跳过导航属性所需的更改外,我们不计划进行重大查询更改。 然而,修复3.0大修遗留下来的一些技术债务仍需要做大量工作。 我们还计划修复许多 bug 并实施小型增强功能,以进一步改善整体查询体验。

迁移和部署体验

主要开发人员:@bricelam

通过 #19587 进行跟踪

T 恤尺寸:L

状态:已限定范围/完成

范围:迁移捆绑功能已推迟到 EF Core 5.0 发布之后。 但是,EF Core 5.0 中将包含与迁移相关的一些其他目标改进

目前,许多开发人员在应用程序启动时迁移其数据库。 这很容易,但不建议这样做,因为:

  • 多个线程/进程/服务器可能会尝试同时迁移数据库
  • 应用程序可能会尝试在发生此情况时访问不一致的状态
  • 通常,应用程序执行时不应获得修改数据库架构的权限。
  • 如果出现问题,很难恢复为干净状态

我们希望在此处提供更好的体验,这样就可以在部署时轻松迁移数据库。 这应该:

  • 在 Linux、Mac 和 Windows 上工作
  • 在命令行上具有良好体验
  • 支持采用容器的方案
  • 使用常用的实际部署工具/流程
  • 至少集成到 Visual Studio 中

很可能会在 EF Core 中进行许多小的改进(例如,在 SQLite 上提供更好的迁移功能),同时与其他团队进行指导和长期协作,以改善不仅限于 EF 的端到端体验。

EF Core 平台体验

首席开发人员:@roji 和 @bricelam

通过 #19588 进行跟踪

T 恤尺寸:L

状态:限定范围/完成

范围:平台指南和示例针对 Blazor、Xamarin、WinForms 和 WPF 发布。 现已计划为 EF Core 6.0 的发行进行 Xamarin 和其他 AOT/链接器工作。

重要

Xamarin.Android、Xamarin.iOS、Xamarin.Mac 现在直接集成到 .NET(从 .NET 6 开始)作为适用于 Android 的 .NET、适用于 iOS 的 .NET 和适用于 macOS 的 .NET。 如果要使用这些项目类型进行构建,则应将其升级到 .NET SDK 样式项目,以便继续提供支持。 有关将 Xamarin 项目升级到 .NET 的详细信息,请参阅 从 Xamarin 升级到 .NET & .NET MAUI 文档。

我们提供了有关在类似传统 MVC 的 Web 应用程序中使用 EF Core 的良好指导。 其他平台和应用程序模型的指南缺失或过期。 对于 EF Core 5.0,我们计划调查、改进和记录在以下方面使用 EF Core 的体验:

  • Blazor
  • Xamarin,包括使用 AOT/链接器情景
  • WinForms/WPF/WinUI 和可能的其他用户界面框架

这很可能是 EF Core 中的许多小改进,以及与其他团队的指南和长期协作,以改进超越 EF 的端到端体验。

我们计划查看的特定领域包括:

  • 部署,包括使用 EF 工具(例如迁移)的体验
  • 应用程序模型,包括 Xamarin 和 Blazor,可能还有其他模型
  • SQLite 体验,包括空间体验和表重新生成
  • AOT 和链接体验
  • 诊断集成,包括性能计数器

性能

首席开发人员:@roji

通过 5.0 里程碑中使用 area-perf 标记的问题进行跟踪

T 恤尺寸:L

状态:已限定范围/完成

范围:Npgsql 提供程序中的主要性能改进已完成。 现在计划为 EF Core 6.0 开展其他性能优化工作。

对于 EF Core,我们计划改进性能基准套件,并针对运行时进行定向性能改进。 此外,我们计划完成在 3.0 发布周期中原型的新 ADO.NET 批处理 API。 此外,在 ADO.NET 层,我们还计划对 Npgsql 提供程序进行其他性能改进。

作为这项工作的一部分,我们还计划根据需要添加 ADO.NET/EF 核心性能计数器和其他诊断。

体系结构/参与者文档

文档管理人员主管:@ajcvickers

通过 #1920 进行跟踪

T 恤尺寸:L

状态:删减

此处的想法是,更轻松地了解 EF Core 内部的内容。 这对使用 EF Core 的任何人来说都非常有用,但主要动机是让外部用户更容易:

  • 为 EF Core 代码做出贡献
  • 创建数据库提供者
  • 生成其他扩展

更新:不幸的是,这个计划太雄心勃勃了。 我们仍然相信这一点很重要,但不幸的是,它不会与 EF Core 5.0 一起登陆。

Microsoft.Data.Sqlite 文档

文档管理人员主管:@bricelam

通过 #1675 进行跟踪

T 恤大小:M

状态:已完成。 新文档在 Microsoft Learn上实时提供

EF 团队还拥有 Microsoft.Data.Sqlite ADO.NET 提供程序。 我们计划在 5.0 版本中完整记录该提供者的详细信息。

常规文档

文档管理人员主管:@ajcvickers

通过 5.0 里程碑中的文档存储库中跟踪问题

T 恤尺寸:L

状态:正在进行

我们正在更新 3.0 和 3.1 版本的文档。 我们还致力于:

  • 对入门文章进行彻底改革,使其更易于访问/更容易遵循
  • 重组文章,以便于查找和添加交叉引用
  • 向现有文章添加更多详细信息和说明
  • 更新示例并添加更多示例

修复漏洞

通过 5.0 里程碑中使用 type-bug 标记的问题进行跟踪

开发人员:@roji、@maumar、@bricelam、@smitpatel、@AndriySvyryd、@ajcvickers

T 恤尺寸:L

状态:正在进行

在撰写本文时,我们计划在 5.0 版本中修复 135 个 bug(其中已有 62 个已修复),但这些与上述 常规查询增强功能部分 存在显著重叠。

在 3.0 版本期间,传入率(最终成为里程碑工作的问题)大约为每月 23 个问题。 并非所有这些内容都需要在 5.0 中修复。 作为粗略的估计,我们计划在 5.0 时间范围内再修复 150 个问题。

小改进

通过 5.0 里程碑中使用 type-enhancement 标记的问题进行跟踪

开发人员:@roji、@maumar、@bricelam、@smitpatel、@AndriySvyryd、@ajcvickers

T 恤尺寸:L

状态:完成

除了上面概述的较大功能之外,我们还计划对 5.0 进行许多较小的改进,以修复“小问题”。 请注意,上述更常规的主题也涵盖了其中许多增强功能。

非计划

通过使用 consider-for-next-release 标记的问题进行跟踪

这些是当前未针对 5.0 版本计划的 bug 修复和增强功能,但我们将根据以上工作的进度将它们视为延伸目标。

此外,我们始终会在计划时考虑投票最多的问题。 从版本中去除其中任何问题总是很痛苦的,但是我们确实需要针对所拥有的资源制定切合实际的计划。

建议

有关规划的反馈非常重要。 指示问题重要性的最佳方法是在 GitHub 上投票(大拇指)。 然后,此数据将进入下一个版本的计划过程