第三十节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。