SqlException:“$”附近的语法不正确。升级到 Dotnet 8 后 - 数据库兼容版本 - 不是 EFCore UseCompatibilityLevel

Ara*_*ndi 4 c# sql-server ef-code-first entity-framework-core

我有一个 ASP.NET Core 项目,它在 EF Core 中使用代码优先。
从 .NET 7 升级到 .NET 8 以及 EF Core 包后,我遇到了错误

SqlException:“$”附近的语法不正确。

在此输入图像描述

这是来自探查器的查询

exec sp_executesql N'SELECT [t].[id], [t].[idDatetime], [t].[IdDistPath], [t].[idLoadType], [t].[idLoader], [t].[idLoaderDriver], [t].[idShift], [t].[idTruck], [t].[idTruckDriver], [t].[level], [t].[pattern], [t].[Tonnage]
FROM [tbl_Loading] AS [t]
WHERE [t].[idShift] IN (
    SELECT [s].[value]
    FROM OPENJSON(@__shiftsAllIds_0) WITH ([value] int ''$'') AS [s]
)',N'@__shiftsAllIds_0 nvarchar(4000)',@__shiftsAllIds_0=N'[338769,338768]'
Run Code Online (Sandbox Code Playgroud)

这是我的OnConfiguring方法:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    base.OnConfiguring(optionsBuilder);
    optionsBuilder.UseSqlServer(_configuration.GetConnectionString("DefaultConnection")
, o => o.UseCompatibilityLevel(160));
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用 .NET 8 添加另一个迁移并更新数据库,但不幸的是它不起作用。

我在 Stackoverflow 社区中搜索了很多,但没有一个线程与我的问题相关。

环境:

  • .NET 8
  • SQL Server 2022 版本 16.0.1000.6
  • 视窗11

Mar*_*ith 5

生成的 SQL 已按此处所述进行了更改。OPENJSON需要 SQL Server 2016+/兼容级别 130+。

请参阅上述文章中的缓解选项

如果兼容性级别低于 130 (SQL Server 2016),请考虑将其修改为更新的值(文档)。

否则,如果您的数据库版本确实早于 SQL Server 2016,或者设置为旧的兼容性级别且由于某种原因无法更改,请配置 EF Core 以恢复为旧的、效率较低的 SQL,如下所示:

C#

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseSqlServer(@"<CONNECTION STRING>", o => o.UseCompatibilityLevel(120));
Run Code Online (Sandbox Code Playgroud)

在升级数据库兼容性级别并继续您的一天之前,您应该意识到有些人报告这种新方法的性能显着下降,并且没有发现旧方法比新方法“效率较低”。由于执行计划可能会变得更糟。您应该测试此更改对您的工作负载的性能影响。