第三十节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2024-04-08 10:24  Yaopengfei  阅读(8)  评论(0编辑  收藏  举报