使用ToListAsync后随机出现System.Int64转String的InvalidCastException异常
可能触发原因
- DbContext 生命周期配置错误:如果你的DbContext被注册为单例,或者多个异步请求共用同一个DbContext实例,并发执行
ToListAsync时会导致上下文的实体映射状态混乱,随机出现类型匹配错误。这类问题在低并发的本地环境很难复现,只有生产环境有一定并发量时才会偶发。 - EF Core 版本存在已知bug:部分早期版本的EF Core(比如3.1.x、5.0的部分小版本)存在异步查询时实体映射缓存错乱的问题,多个不同类型的异步查询同时执行时,会偶发拿错实体属性和数据库列的映射关系,导致字符串列被映射到long类型的Id字段上。
- 动态查询/视图列错位:如果该实体的查询涉及到原生SQL拼接、动态字段查询或者映射到数据库视图,异步查询时可能偶发结果集列顺序错位,刚好把其他字符串类型的列映射到了Id字段的位置,触发类型转换异常。
- 异步上下文同步阻塞:如果上层调用
GetAllAsync时用了.Result、.Wait()这类同步阻塞方法,会导致EF Core的异步状态机出现异常,进而引发结果解析错误。
排查建议
- 先确认DbContext的注册生命周期,必须为
Scoped,禁止跨请求共享DbContext实例,同时检查所有调用GetAllAsync的上层逻辑,不要使用同步阻塞的方式调用异步方法。 - 将EF Core升级到当前大版本的最新稳定补丁版,排除官方已经修复的异步映射bug。
- 在报错位置添加全局异常捕获,触发异常时把EF Core生成的原始SQL、对应的参数以及结果集的原始数据输出到日志,快速定位是SQL生成错误还是结果解析错误。
- 如果涉及原生SQL查询,强制指定查询列的顺序和实体属性顺序一致,不要使用
select *类的语法。
内容的提问来源于stack exchange,提问作者Bohms27
相关产品推荐
相关产品推荐

