实现异步实体框架存储库的正确方法

本文关键字:方法 存储 异步 实体 框架 实现 | 更新日期: 2023-09-27 18:28:10

我最近读了很多关于实体框架异步的文章,我正在寻找将存储库更改为异步版本的正确方法。它们现在看起来或多或少如下:

public class MyRepo
{
  private DbContext _context;
  public MyRepo()
  {
    _context = new DbContext();
  }
  public int DoSomeStuff(int id)
  {
    var item = _context.MyModels.Where(x => x.Id == id).SingleOrDefault();    
    item.MyProperty = "abcd";
    return _context.SaveChanges();   
  } 
}

调用此存储库的示例:

var myRepo = new MyRepo();
myRepo.DoSomeStuff(1);
myRepo.DoSomeStuff(2);

我可以将DoSomeStuff功能更改为:吗

public async Task<int> DoSomeStuffAsync(int id)
{
  var item = await _context.MyModels.Where(x => x.Id == id).SingleOrDefaultAsync();    
  item.MyProperty = "abcd";
  return await _context.SaveChangesAsync();   
}

或者这是处理DbContext实例的错误方式,应该是:

public async Task<int> DoSomeStuffAsync(int id)
{
  using(var db = new DbContext())
  {
    // ...
  }
}

实现异步实体框架存储库的正确方法

根据您想要的语义,您可以采用任何一种方式。如果您使用的是共享DbContext,那么您只需要记录它,这样您的调用者一次只能调用一个异步方法。