EF6升级EF Core3.1搭配Devart.MySql执行数据库查询无响应问题求助
EF Core 3.1 降级后查询无响应解决方案
该问题属于EF Core 3.x版本与Devart数据提供程序在.NET Framework 4.x环境下的模型初始化、查询翻译环节阻塞问题,查询未发送到数据库即可排除数据库连接、数据库端执行的相关故障,可按照以下步骤排查修复:
- 验证模型初始化是否卡死
在OnModelCreating方法执行完成后,添加手动触发模型元数据加载的测试代码:
若这段代码直接出现无响应,说明问题出在模型映射配置和Devart提供程序、EF Core 3.1的兼容性上,和查询逻辑本身无关。using (var db = new YourDbContext()) { var model = db.Model; // 手动触发模型元数据初始化 } - 关闭Devart提供程序的默认优化配置
Devart dotConnect for MySQL 8.x适配EF Core 3.1时,默认开启的查询预编译、缓存优化逻辑在.NET Framework 4.x环境下大概率会出现死锁,需要在DbContext配置项中关闭对应参数:protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseDevartMySql("你的连接字符串", mysqlOpt => { mysqlOpt.QueryOptimizationEnabled = false; mysqlOpt.IgnoreWhiteSpacesInQueryParsing = true; }); // 额外关闭EF Core 3.1默认的客户端评估异常抛出,避免隐式评估导致阻塞 optionsBuilder.ConfigureWarnings(warnOpt => warnOpt.Ignore(RelationalEventId.QueryClientEvaluationWarning)); } - 排查LINQ查询语法兼容性
EF Core 3.x相比EF6、EF Core 6的LINQ语法支持范围更小,很多高版本支持的隐式类型转换、复杂关联子查询写法在3.x版本无法完成翻译,未开启相关报错配置时会出现翻译环节无限重试卡死的情况。可以先把登录相关的LINQ查询替换为最简单表查询验证:
若最简查询可以正常执行,说明原查询存在不兼容的写法,需要拆分复杂查询或者改写为EF Core 3.1支持的语法。// 最简测试查询 var testUser = dbContext.Users.FirstOrDefault(u => u.UserName == "test"); - 校验EF Core相关依赖包版本一致性
检查项目中所有EF Core相关依赖包(Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.Relational等)的版本必须统一为3.1.32(3.1分支最后一个官方补丁版本),不能存在高版本残留包,版本不一致会导致内部方法调用出现死锁。
额外注意:不要在.NET Framework 4.x的ASP.NET环境下对EF Core的异步查询做同步等待,比如
await query.ToListAsync().Result这类写法会触发ASP.NET同步上下文死锁,也会出现无响应无报错的现象。
内容的提问来源于stack exchange,提问作者Aj Grandeza
相关产品推荐
相关产品推荐

