Entity Framework 6.1.3中SaveChanges随机报错:会话存在其他线程无法开事务
问题原因分析
这个错误的核心问题出在你重写的SaveChanges方法里的日志逻辑,和EF的DbContext会话机制冲突了:
- EF的DbContext本身不是线程安全的,当你在重写的
SaveChanges里执行日志逻辑时,如果触发了未完成的数据库查询操作,就会和base.SaveChanges()的事务启动逻辑冲突。 - 最常见的触发场景:
- 日志逻辑中遍历
ChangeTracker.Entries()时,不小心访问了实体的延迟加载导航属性——这时候EF会悄悄开个后台线程去查关联数据,这个线程还没跑完,base.SaveChanges()就要启动新事务,直接触发报错。 - 日志里写了
IQueryable类型的查询但没立即物化(比如没加ToList()/ToArray()),查询处于延迟执行状态,和事务操作在同一个会话里撞了。
- 日志逻辑中遍历
- 你移除分部类后错误消失,正好印证了问题出在重写的日志逻辑上——原来的代码里没有额外的未完成查询,所以不会触发会话内的线程冲突。
内容的提问来源于stack exchange,提问作者Hasan Shouman
相关产品推荐
相关产品推荐

