.NET 7升级至.NET 8后EF Core报SqlException: $附近语法错误
解决.NET 8 EF Core升级后SqlException: Incorrect syntax near '$'的问题
问题分析
从捕获的SQL语句来看,EF Core生成的OPENJSON语法存在错误:WITH ([value] int ''$'')中多了一层转义单引号,SQL Server 2022(兼容性级别160)执行时会判定为语法错误,正确写法应为WITH ([value] int '$')。
解决方案
1. 统一EF Core SqlServer包版本
确保项目中所有EF Core相关包(尤其是Microsoft.EntityFrameworkCore.SqlServer)的版本为8.x.x,与.NET 8完全匹配,避免版本不兼容导致的SQL生成逻辑异常。可通过NuGet包管理器检查并同步版本。
2. 移除显式兼容性级别配置
SQL Server 2022的默认兼容性级别即为160,显式设置UseCompatibilityLevel(160)可能干扰EF Core对数据库特性的自动检测。修改OnConfiguring方法:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); optionsBuilder.UseSqlServer(_configuration.GetConnectionString("DefaultConnection")); }
3. 调整LINQ查询写法
若使用Contains方法传入整数列表触发该SQL,可尝试将集合类型明确为List<int>,或改用原生查询规避自动生成逻辑:
var shiftsAllIds = new List<int> { 338769, 338768 }; var data = context.tbl_Loading .FromSql($"SELECT * FROM tbl_Loading WHERE idShift IN ({string.Join(",", shiftsAllIds)})") .ToList();
4. 重置迁移文件
旧迁移文件可能残留.NET 7的配置逻辑,尝试清理后重新生成:
# 删除现有迁移(注意备份) dotnet ef migrations remove # 生成.NET 8适配的新迁移 dotnet ef migrations add Net8Migration # 更新数据库 dotnet ef database update
验证
修改后重新运行项目,通过数据库探查器确认生成的OPENJSON语句语法是否正确,即WITH ([value] int '$')。
内容的提问来源于stack exchange,提问作者Arash.Zandi
相关产品推荐
相关产品推荐

