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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值