ef core 执行原生sql语句
背景
在使用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);
}
}