正确实现异步Entity Framework存储库的方法

时间:2014-10-29 08:44:47

标签: c# entity-framework asynchronous

我最近读了很多关于Entity Framework异步的内容,而且我正在寻找将我的存储库更改为异步版本的正确方法。他们现在看起来或多或少如下:

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())
  {
    // ...
  }
}

1 个答案:

答案 0 :(得分:1)

您可以采用任何一种方式,具体取决于您想要的语义。如果您使用的是共享DbContext,则只需记录,以便您的呼叫者一次只能调用一个异步方法。