正确调用数据库的正确方法

问题描述

所以我问这个问题,因为我不确定这些选项中的哪个是保持异步的正确解决方案。我猜两者都可以胜任,但我仍然想确定哪种方法最合适:

调用方法(保持不变)

  public async Task GetEntry(int id)
  {
     var entity = await _repository.GetByIdAsync(id)
  }

选项1:存储库 注意:此选项未使用异步修饰符

  public Task<MyEntity> GetByIdAsync(int id)
  {
       return Query().SingleOrDefaultAsync(e => e.Id == id);
  }

  public IQueryable<MyEntity> Query()
  {
      return _dbContext.Set<MyEntity>().AsQueryable();;
  }

选项2:存储库(使用await和async修饰符)

  public async Task<MyEntity> GetByIdAsync(int id)
  {
       return await Query().SingleOrDefaultAsync(e => e.Id == id);
  }

  public IQueryable<MyEntity> Query()
  {
      return _dbContext.Set<MyEntity>().AsQueryable();;
  }

解决方法

我认为这将基于观点而关闭,因此我将首先给出我的观点:

2和3似乎非常规地使用EF(例如,不是直接在上下文中使用DbSet,而是按类型)。

1根本没有使用EF,但是对于单元测试很有用,因为隐藏了实际的数据库调用(尽管如果您使用的是.net core,则可以使用内存数据库来测试EF,因此可能还是没有意义。

您可能会说2中的第一个函数很好,因为它只是在不等待的情况下返回任务(这节省了上下文切换)。

要考虑的另一件事是,即使EF支持异步/等待,每个DbContext也不能同时由多个任务使用。如果尝试这种方法,应该会得到一个例外。当然,如果每个工作单元都有一个单独的DbContext,那么这不是问题。