背景

在使用abp vNext开发过程中,因项目使用的是ef core作为ORM工具,而Ef的批量操作性能并不能让人满意。于是便有了使用原生sql操作数据库的需求。

使用

既然说到使用了abp vNext,那肯定利用abp的功能实现更为方便。代码如下:

方式一

第一种情况,可以获取到仓储对象,Repository。无需在意哪个实体的仓储,任意实体仓储

private async Task ExecuteSql(string sql)
{
    using (var dbContext = _coursewareRepository.GetDbContext())
    {
        var aa =await dbContext.Database.ExecuteSqlRawAsync(sql);
    }
}

方式二

正常情况下,上述方式可以满足正常使用了,但是如果使用了后台任务,在后台任务中使用sql,该方式会报cannot access a disposed object的错误,提示dbContext已被释放。可通过以下方式进行使用。

private async Task ExecuteSql(string sql)
{
    using (var scope = ServiceScopeFactory.CreateScope())
    {
        var db = scope.ServiceProvider.GetService<IdeologyFrontDbContext>();
        var a = await db.Database.ExecuteSqlRawAsync(sql);
    }
}

标签: ef core, Abp vNext, 原生SQL, cannot access a disposed object

添加新评论