2024年7月15日星期一

升级到.Net 8后EF Core 8 (EF8) 报SqlException: “$”附近有语法错误

是因为 .net 8 优化了 Contains 子句的 SQL 翻译,之前的 IN 查询有性能问题,在 SQL 中插入常量值会导致许多性能问题,从而造成查询计划缓存失败,并导致不必要地逐出其他查询。 新的 EF Core 8.0 转换使用 SQL Server OPENJSON 函数,以改为将值作为 JSON 数组传输。 这解决了上述技术固有的性能问题:但函数 OPENJSON 在 SQL Server 2014 及更低版本中不可用。

但这个优化只有 SQL Server 2016 及以上版本的数据库支持,否则就会报这个错

而且即便数据库引擎版本达到,数据库本身的兼容性设置如果低于 SQL Server 2016 的话,也会报错

解决方案1:

请通过以下命令检查已配置的数据库兼容性级别:

SQL
SELECT name, compatibility_level FROM sys.databases;

如果查询结果的兼容级别低于 130 (SQL Server 2016),请考虑将数据库兼容性级别调整为130 (SQL Server 2016)或更高版本


如果数据库版本低于SQL Server 2016,那请安装SQL Server 2016或更高的版本。

解决方案2:

在代码中增加兼容性配置项:

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

参考:EF Core 8.0 (EF8) 中的中断性变更 - EF Core | Microsoft Learn