使用 using around the DB context 确定 LINQ 语句的范围

Determining the scope of LINQ statement with a using around the DB context

我有一个函数 returns 查询结果可以像这样进一步过滤:

public IQueryable<MyData> Query(string name) {
  using (var dbc = new MyDbContext()) 
    return dbc.MyData.Where(v => v.Name == name);
}

然后我在另一个函数中调用它:

public f() { 
  var res = Query("john").Select(v => ......
  var resList = res.ToList();
  ...
}

在这种情况下 MyDbContext 的范围是什么?它什么时候处置?当 Query() returns 或 ToList() in f() 完成时?

如果是前者,我该如何更改它以便在 ToList() 完成时处理数据库上下文?

(注意:我知道通常不需要在 EF 中使用 DbContext,但在这种情况下我想要它,因为我正在尝试解决 sqlite 锁定问题)

谢谢!

嗯,using 子句只是一个 try finally 块。所以 Query 将被转换为类似:

public IQueryable<MyData> Query(string name) {
  MyDbContext dbc;

  dbc = new MyDbContext();
  try
  {

     return dbc.MyData.Where(v => v.Name == name);
  }
  finally
  {
     dbc.Dispose();
  }   
}

Query returns IQueryable 之后,上下文很可能会立即被释放(甚至在调用 .Select(v => ...... 之前)。

让调用者处置上下文有点 'cleaner'。您可以在 Query 函数之外创建一个上下文对象并将其作为参数传递:

public IQueryable<MyData> Query(MyDbContext dbc, string name) {
     return dbc.MyData.Where(v => v.Name == name);
}

public f() { 
  using(var dbc = new MyDbContext())
  {
      var res = Query(dbc, "john").Select(v => ......
      var resList = res.ToList();
      ...
  }      
}

总体思路很简单,建议不要过于复杂:

  1. 创建数据库上下文
  2. 用它做任何你想做的事
  3. 处理它