本文主要是介绍ABP 在中抛出“Cannot access a disposed object. A common cause of this error is disposing”异常分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
知识点:
在ABP框架中,AppService 等是自带UnitOfWork的。然后其他的例如 后台任务(BackgroundWork)、定时任务(AbpQuartz)等的Excute方法没有自带UnitOfWork特性。
UnitOfWork(工作单元):
工作单元在ABP承担着 数据库链接以及事务的责则,同一个工作单元中共享一个数据库连接以及事务。
问题解析:
异常中描述的就是数据库上下文 DBContext 被释放了。那么为什么被释放了?其实就是翻译问题。真实的情况是 就是DBContext还没有打开数据库链接。
我们从官方文档对UnitOfWork的介绍中(文档链接在下面),对于GetAll()方法的调用前需要先打开数据库链接(详细原因的请看文档介绍)。
那么在这里,想必都清楚这个异常其中的原由吧。首先的成方法中没有定义UnitOfWork(工作单元),由于工作单元在Abp中负责数据库的链接以及事务,导致你的方法执行时没有打开数据库链接,在你执行IRepository.GetAll方法时,由于GetAll方法需要提前打开数据库链接,所以抛出了DBContext已经被释放的异常。
解决方案:
解决方案肯定是在GetAll执行前打开数据库链接咯。既然UnitOfWork负责链接和事务,那么就在方法上添加[UnitOfWork]特性就可以了。
官方文档:
https://aspnetboilerplate.com/Pages/Documents/Unit-Of-Work#irepository-getall-method
这篇关于ABP 在中抛出“Cannot access a disposed object. A common cause of this error is disposing”异常分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!