计划于 2023 年 11 月发布的 Entity Framework Core 8 带来了新功能以及对EF Core 7中已经引入的功能的改进。值得注意的功能包括支持未映射类型的原始 SQL 查询、延迟加载改进以及对 TimeOnly 和 DateOnly SQL Server 数据类型的支持。
EF7 已经为标量类型引入了原始 SQL 查询,但是,在 EF8 中,原始 SQL 查询现在可以返回任何未包含在实体框架模型中的可映射 CLR 类型。以这种方式执行的查询支持实体框架功能,例如参数化构造函数和映射属性。值得注意的是,不支持未映射类型与模型中其他类型之间的关系,因为未映射模型不能定义外键。
SQL 视图和函数也可以使用此方法查询,并且可以像映射表一样映射到任何 CLR 类型。
Entity Framework 8 添加了对未跟踪查询中导航属性延迟加载的支持。未跟踪查询的延迟加载属性适用于使用代理和不使用代理的延迟加载。
不过,这种方法有一些注意事项。延迟加载仅在用于执行无跟踪查询的 DbContext 被处理掉之前起作用。延迟加载同样不适用于与 DbContext 分离的实体。此外,延迟加载将始终使用同步 I/O,因为无法异步访问导航属性。
当导航属性在 EF6 应用程序中没有 virtual 关键字时,延迟加载功能将不会自动运行,从而导致错误。
在 EF Core 中,为避免常见错误,当导航属性上不存在 virtual 关键字时,代理会抛出异常。由于这种新的 EF Core 行为,EF Core 8 引入了一个选择退出功能,您可以使用该功能预先加载您明确设置为以这种方式加载的特定导航属性。
EF Core 8 for SQL Server 现在原生支持 DateOnly(映射到日期类型列)和TimeOnly(映射到时间类型列)数据类型。直到现在(在 EF Core 6 和 7 中),您只能通过安装社区 NuGet 包来使用这些类型。这两种新类型也可用于 SQL JSON 列。
中等影响的重大更改也与这些类型有关。在早期版本的 EF 中,日期和时间列类型分别被构建为 DateTime 和 TimeSpan 类型。在 EF8 中,改用新的 DateOnly 和 TimeOnly 类型映射。这只会影响使用数据库优先方法并定期重新构建其代码模型的用户。受此更改影响的用户可以使用缓解策略。
您可以从Microsoft 官方来源阅读有关 EF8 计划的更多信息,并在EF Core GitHub 问题页面上对您希望实现的功能进行投票。您可以下载EF Core 8 的最新预览版,该预览版于 2023 年 2 月 21 日作为 NuGet 包发布。它支持 .NET 6 和 .NET 7 项目。关于作者阿伦根齐奇,解决方案架构师、团队负责人和全栈 .NET 开发人员,在开发数字产品、领导开发团队和指导年轻开发人员方面拥有超过 10 年的经验。