我有一个 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]'
这是我的
OnConfiguring
方法:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseSqlServer(_configuration.GetConnectionString("DefaultConnection")
, o => o.UseCompatibilityLevel(160));
}
我尝试使用.NET 8添加另一个迁移并更新数据库,但不幸的是它不起作用。
我在 Stackoverflow 社区搜索了很多,但没有一个线程与我的问题相关。
环境:
生成的 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));
正如 Martin Smith 评论的那样,我已经在
master
数据库 上执行了此查询
SELECT name, compatibility_level FROM sys.databases
看到我的数据库兼容性是120而不是160
看来我应该先更新我的数据库兼容性
微软文档