第三十节:EFCore8.0新增功能和中断性变更
一. 新功能清单
详见:https://learn.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-8.0/whatsnew
二. 中断性变更
1. LINQ 查询中的 Contains 低版本SQLServer失效
(1). 说明
从 EF Core 8.0 开始,EF 对Contains 可生成更高效的 SQL,但在 SQL Server 2014 及更低版本上不受支持。
旧版本生成的SQL语句是: in
新版本:在 SQL 中插入常量值会导致许多性能问题,从而造成查询计划缓存失败,并导致不必要地逐出其他查询。
新的 EF Core 8.0 转换使用 SQL Server OPENJSON 函数,以改为将值作为 JSON 数组传输。
Linq查询
var names = new[] { "Blog1", "Blog2" };
var blogs = await context.Blogs
.Where(b => names.Contains(b.Name))
.ToArrayAsync();
旧版
SELECT [b].[Id], [b].[Name]
FROM [Blogs] AS [b]
WHERE [b].[Name] IN (N'Blog1', N'Blog2')
EFCore8.x新版
Executed DbCommand (49ms) [Parameters=[@__names_0='["Blog1","Blog2"]' (Size = 4000)], CommandType='Text', CommandTimeout='30']
SELECT [b].[Id], [b].[Name]
FROM [Blogs] AS [b]
WHERE EXISTS (
SELECT 1
FROM OPENJSON(@__names_0) AS [n]
WHERE [n].[value] = [b].[Name])
(2). 解决办法
使用UseCompatibilityLevel调整兼容级别,代码如下: 120代表能兼容到2008 R2
optionsBuilder.UseSqlServer(str, o => o.UseCompatibilityLevel(120));
详细的版本详见截图
2. SQL Server date 和 time 现已搭建到 .NET DateOnly 和 TimeOnly
旧版:
以前,当使用 date 或 time 列搭建 SQL Server 数据库时,EF 将生成类型为 DateTime 和 TimeSpan 的实体属性。
新版:
从 EF Core 8.0 开始,date 和 time 被搭建为 DateOnly 和 TimeOnly。
3. bool列不可为null
从 EF Core 8.0 开始,bool 列始终被搭建基架为不可为 null 的属性。
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2022-04-08 第二十一节:async异步函数和await关键字详解、异常处理方案