Asp.Net Core 5使用EF Core仓储模式触发AppDbContext已释放异常如何修复
修复方案
核心原因
该异常触发90%以上的概率是你注入的AppDbContext被代码手动提前释放了,而你配置的DI容器原本应当负责在请求结束后自动释放Context实例。
具体修复步骤
- 检查你的
IUowAsync<AppDbContext>实现类的代码,删除所有手动释放AppDbContext的逻辑
绝大多数人写工作单元实现时会习惯性在Dispose方法中添加_dbContext.Dispose()代码,这段代码会在第一个仓储操作完成后就把上下文销毁,后续同一个请求的仓储操作就会触发释放异常,直接删掉这行手动释放Context的代码即可。 - 检查所有仓储类的内部实现,避免两类错误:
- 不要在任何仓储方法中用
using语句包裹AppDbContext操作,所有数据库操作复用构造函数注入的Context实例即可 - 所有异步仓储方法必须全程正确使用
await关键字,不要用.Result、.Wait()这类同步阻塞调用,也不要未加await就直接返回Task对象
- 不要在任何仓储方法中用
- 排查你是否在Edit方法的第一个查询后调用了
_uow的释放/提交方法触发了Context销毁,你的现有Edit代码中没有相关逻辑,但如果你的_absenceRepository.GetByIdAsync内部调用了Uow的释放逻辑,也会触发该问题
验证方法
你可以先注释掉LoadForEditAsync方法内的三行查询代码,直接返回View,如果没有再抛出异常,就能确认是Context被提前释放的问题,按上面的步骤排查Uow和仓储代码即可。
你的现有服务注册代码没有问题,不需要修改。
内容的提问来源于stack exchange,提问作者JOCKH
相关产品推荐
相关产品推荐

