如何使用存储库模式在 EF Core 3.0 中进行并行异步查询?

Ars*_*ync 5 c# repository-pattern ef-core-3.0

我有像

public interface IEmployeeRepository
{
  Task<EmployeeSettings> GetEmployeeSettings(int employeeId);
  Task<ICollection<DepartmentWorkPosition>> GetWorkPositions(int employeeId);
}
Run Code Online (Sandbox Code Playgroud)

存储库的构造函数(DbContext 注入):

public EmployeeRepository(EmployeeDbContext dbContext)
{
  _dbContext = dbContext;
}
Run Code Online (Sandbox Code Playgroud)

并在 EF Core 2.0 中调用它,例如

var settingsTask = _employeeRepository
    .GetEmployeeSettings(employeeId.Value);

var workPositionsTask = _employeeRepository
    .GetWorkPositions(employeeId.Value);

await Task.WhenAll(settingsTask, workPositionsTask);

// do other things...
Run Code Online (Sandbox Code Playgroud)

问题:

对于 EF Core 3.0,有 InvalidOperationException:在上一个操作完成之前,在此上下文上启动了第二个操作...

DbContext 在 ConfigureServices 中注册,如

services.AddDbContext<EmployeeDbContext>(ServiceLifetime.Transient);
Run Code Online (Sandbox Code Playgroud)

教程如下:Entity Framework Core 不支持在同一个 DbContext 实例上运行多个并行操作。

但!如何在异步存储库中使用它?

Ste*_*ary 2

如何在异步存储库中使用它?

每个存储库只能同时有一个异步请求。如果您需要一次拥有多个存储库,那么您就需要多个存储库。这可能需要您将存储库工厂注入到您的类型中。