2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

EF Core 3 的 40 个中断性变更

  • 2019-06-17
  • 本文字数:1883 字

    阅读完需:约 6 分钟

EF Core 3 的 40 个中断性变更

为了修复 Entify Framework Core 中许多已发现的缺陷,微软在 EF Core 3 中引入了 40 个中断性变更。我们可以在微软文档中查看完整的中断性变更列表,本文仅列举几个主要的点。

客户端查询

为了突破 EF Core SQL 生成器的限制,默认只在客户端执行部分查询。这意味着对于部分不能转换成 SQL 的 LINQ 查询,需要从数据库加载数据表,并在内存中执行其余的操作。在 2.1 版本之前,Group By 都是在客户端执行的。


这种方式的缺点是,Where() 子句中的一个问题可能导致 EF Core 加载整张数据表。开发人员还发现,在无法生成相关子查询的情况下,它将执行成百上千个二级查询。


新的默认行为是 EF Core 仅允许在客户端执行最终的 Select() 操作。如果 EF Core 不能生成正确的 SQL,将引发异常。开发人员可以覆盖这个行为,但微软更希望开发者遇到这个问题时先尝试提交一个 bug 请求。


可以在“3.0查询指导原则大纲和决策点“中了解更多有关该变更的信息。

参数化及插值 SQL

正如我们在 2017 年报告的那样,EF Core的字符串插值特性引起了许多关注。使用该特性可以将内插字符串自动转换为参数化 SQL,但前提是这些字符串之前没有被存储在临时变量中。


v1 = context.Customers.FromSql($"SELECT * FROM Customers WHERE City = {city}");

var sql = $"SELECT * FROM Customers WHERE City = {city}";v2 = context.Customers.FromSql(sql);
复制代码


在上面的例子中,v1 是正确参数化的,而 v2 则引入了一个 SQL 注入漏洞。


为了消除上述漏洞,将移除 FromSql 函数,并使用 FromSqlRawand 和 FromSqlInterpolated 替代。

临时键

EF Core 通常会创建临时主键来跟踪新实体。这些临时主键以负数的形式存储在键属性中(例如 CustomerKey 或 OrderId)。理论上,这些临时主键在生成时会被真正的键所替换,不过也存在几个例外情况,比如那些在用户界面上显示的假键甚至会被保存到数据库中。


EF Core 3 将把此类跟踪信息转移到实体的跟踪信息中,让键属性只持有数据。

级联删除时机

在调用诸如 context.Remove() 等方法时,级联删除将立即发生。在此之前,EF Core 在 SaveChanges 被调用之前不会计算哪些子项被删除,因此很难预测到底会发生什么。该变更主要影响那些用于记录将要修改/删除哪些数据项日志的代码。


可以通过将 CascadeDeleteTiming 和 DeleteOrphansTiming 选项设置成 CascadeTiming.OnSaveChanges 来还原以前的行为。

查询类型已过时

与之前版本的 Entity Framework 不同,EF Core 被设计成只能处理包含主键的数据表。这是有问题的,因为视图或存储过程的结果没有主键。所以 EF core 2.1 引入了查询类型的概念。


本质上,查询类型使用的是并行对象模型。开发人员使用 DbQuery 而不是 DbSet 来定义它们,使用 ModelBuilder.Query<>() 而不是 ModelBuilder.Entity<>() 来注册它们,并使用 DbContext.Query<>() 而不是 DbContext.Set<>() 来调用它们。


许多开发人员抱怨查询类型和实体类型之间存在不必要的混淆,因此查询类型被移除了。从 EF Core 3 开始,开发人员应该对所有数据源使用常规的 DbSet 模型。如果没有主键,开发人员在注册实体时只需使用 .HasNoKey() 来注解它们。

忽略属性的 Getter 和 Setter

在过去,除非要物化查询结果,否则 EF Core 将调用属性的 getter 或 setter 方法。在进行查询时,如果已知属性的支持字段,它将绕过属性,直接写入底层字段。


在这个变更之后,如果已知属性的支持字段,将始终使用底层支持字段。这样做的好处是可以防止意外触发业务逻辑。


缺点是诸如更新计算字段之类的业务逻辑也不会被触发。因此,我们可能需要修改 UsePropertyAccessMode 来获得我们想要的行为。

支持字端检测

在检测支持字段时,代码有时候会有歧义。在过去,EF Core 只能根据内部排名系统来猜测应该设置哪个字段。


在 EF Core 3 中,任何有歧义的地方都将抛出异常。不过,开发人员必须手动指出要使用模型生成器生成的哪个字段。

用 ValueTask 替换 Task

将 Task 作为对象被认为是.NET 的最大错误之一。虽然对于长时间运行的任务来说是可以接受的,但当创建了大量的短期任务时,它常常会造成过大的内存压力,所以新版本引入了基于结构的备选方案 ValueTask 。


为了支持这种新类型,更新了 FindAsync 和 NextValueAsync 等几个方法,让它们返回 ValueTask 而不是 Task 。这不会影响那些等待获取结果的代码,但如果要对任务执行其他操作,可能需要调用 AsTask() ,将其从 ValueTask 转换到 Task 。

简化 IEntityType 和 IProperty

删除了这两个接口中的五个属性,并用扩展方法进行替换。这样做的依据是如果接口表面越小就容易实现。


查看英文原文:40 Breaking Changes in EF Core 3


2019-06-17 08:0014907
用户头像

发布了 369 篇内容, 共 260.2 次阅读, 收获喜欢 640 次。

关注

评论 3 条评论

发布
用户头像
SQL注入没明白
2019-06-19 07:56
回复
用户头像
“BreakingChanges”还是翻译成“破坏性变更”好一点吧。
2019-06-17 08:08
回复
Breaking一般会选择翻译成“破坏性”或“重大” 这个在微软官方文档中使用了“中断性”,所以这里也使用中断性了
https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-3.0/breaking-changes
2019-06-17 14:29
回复
没有更多了
发现更多内容

一群不想鸡娃的直男程序员,决定对一支笔下手了

脑极体

技术+商业,能否让网易智企一鸣惊人?

ToB行业头条

网易 tob

HarmonyOS学习路之开发基础——快速入门(实现页面跳转)

爱吃土豆丝的打工人

HarmonyOS DevEco 页面跳转 鸿蒙页面跳转

30家企业单笔融资1亿以上,如何让投资人倒追你的项目

创业邦

git版本升级

阿呆

GIT基本概念与核心命令

IT视界

git 版本管理

让宝妈宝爸告别安全顾虑,区块链构建母婴行业新生态

旺链科技

区块链 母婴

有人融资超6亿,有人营收20亿…这届90后创业者有点猛! | 创业邦2021年30位30岁以下创业新贵重磅发布

创业邦

源码解析:一文读懂 Kubelet

张晓辉

Kubernetes 源码分析 kubelet

企业云迁移暗藏风险,1人如何扛起性能测试大旗?

TakinTalks稳定性社区

高可用 电商 全链路压测 性能压测 云迁移

击破行业痛点,区块链赋能智慧物流高速发展

旺链科技

区块链 智慧物流

HarmonyOS学习路之开发篇——Ability

爱吃土豆丝的打工人

HarmonyOS Ability Ability概述 鸿蒙 Ability

政治局会议再提工业互联网产业数字化|区块链如何协同发力?

旺链科技

区块链 工业互联网

100个自媒体运营工具推荐

资源君

运营 工具软件 自媒体 资源分享 工具分享

HarmonyOS 分布式多端应用一站式开发平台(DevEco Studio 安装)

爱吃土豆丝的打工人

操作系统 HarmonyOS 环境变量 DevEco Studio 鸿蒙开发

HarmonyOS学习路之开发基础知识——应用配置文件

爱吃土豆丝的打工人

HarmonyOS 鸿蒙开发 鸿蒙系统 鸿蒙配置文件 deviceConfig

HarmonyOS学习路之开发基础——快速入门(创建另一个页面)

爱吃土豆丝的打工人

HarmonyOS 鸿蒙开发 DevEco Studio 创建新页面 创建另一个页面

更好链接资金需求 | 区块链如何赋能“链”金融

旺链科技

金融

HarmonyOS学习路之HarmonyOS 概述

爱吃土豆丝的打工人

操作系统 HarmonyOS 鸿蒙系统

HarmonyOS学习路之开发基础知识——资源文件

爱吃土豆丝的打工人

鸿蒙 HarmonyOS DevEco资源文件 创建资源文件

区块链 | 让付费的知识真正“物超所值”

旺链科技

区块链 知识付费

你真的了解 equals 方法吗?

若尘

java编程 equals 6月日更

HarmonyOS学习路之开发基础知识——应用基础知识

爱吃土豆丝的打工人

鸿蒙 HarmonyOS 鸿蒙开发 鸿蒙系统

HarmonyOS学习路之开发篇——Page Ability

爱吃土豆丝的打工人

HarmonyOS AbilitySlice路由 AbilitySlice生命周期 AbilitySlice间导航 跨设备迁移

解决权限管控难题,保障数据安全——CloudQuery在证券行业的实践

BinTools图尔兹

数据库 高可用 脱敏 数据库管理 权限管理

以互联网行业为背景下的数据分析通识(上)

小飞象@木木自由

数据分析 数据分析体系 数据思维

网络攻防学习笔记 Day45

穿过生命散发芬芳

网络攻防 6月日更

英特尔推出全新的基础设施处理器(IPU)

E科讯

HarmonyOS学习路之开发基础——快速入门(编写第一个页面)

爱吃土豆丝的打工人

HarmonyOS 鸿蒙应用开发 DevEco Studio 创建页面 鸿蒙开发第一个页面

微服务的简介和技术栈

xcbeyond

微服务 发展史 6月日更

JAVA笔记(二)--Java初始

加百利

Java 后端 6月日更

EF Core 3 的 40 个中断性变更_语言 & 开发_Jonathan Allen_InfoQ精选文章