Entity Framework是否支持并行异步查询?

时间:2014-07-11 16:15:12

标签: .net entity-framework entity-framework-6

当我们启动多个异步实体框架查询并且并行运行它们时会发生什么?

他们是否并行执行?它们是否由实体框架序列化?这不受支持吗?它会导致异常吗?

public async Task QueryDatabase()
{
    using (var context = new MyDbContext())
    {
        Task task1 = context.SomeTable1.ToListAsync();
        Task task2 = context.SomeTable2.ToListAsync();

        await Task.WhenAll(task1, task2);
    }
}

3 个答案:

答案 0 :(得分:59)

根据specifications of version 6不支持此功能。

这应该抛出一个DbConcurrencyException例外

  

在此上下文之前的第二个操作开始   异步操作已完成。使用'等待'确保任何   在调用另一个方法之前已完成异步操作   在这种背景下。任何实例成员都不能保证是线程   安全

     如果开发人员一次尝试执行两次异步操作并抛出,则

EF将检测

来自a codeplex page of the project

  

实际上是启用数据库操作的异步执行   正交以在同一上下文中启用并发执行。在   服务器场景的特殊情况,使用并发访问可以   影响可伸缩性,因为它意味着为了   处理单个请求,您将旋转任意数字   不同的线程。所有线程都会争夺资源   作为服务器其他并发所需的其他线程的内存   请求。

答案 1 :(得分:2)

正如ken2k所提到的那样,当使用实体框架与MS SQL Server时,这是不允许的。但是,如果您将实体框架与Oracle一起使用,则允许这样做。

答案 2 :(得分:0)

只是想用 EF 5 更新它,现在可以拆分在单独查询中加载导航属性的查询: https://docs.microsoft.com/en-us/ef/core/querying/single-split-queries

仍然无法解决您的问题,但了解一下可能会有所帮助。