更新- 答案显然是 DbLinq 没有Dispose()
正确实现。哦!
以下是各种误导 - 底线:DbLinq 不(尚未)等同于 LinqToSql,正如我最初问这个问题时所假设的那样。谨慎使用!
我将存储库模式与 DbLinq 一起使用。我的存储库对象实现了,IDisposable
并且该Dispose()
方法只做一些事情——调用Dispose()
. DataContext
每当我使用存储库时,我都会将其包装在一个using
块中,如下所示:
public IEnumerable<Person> SelectPersons()
{
using (var repository = _repositorySource.GetPersonRepository())
{
return repository.GetAll(); // returns DataContext.Person as an IQueryable<Person>
}
}
这个方法返回一个IEnumerable<Person>
,所以如果我的理解是正确的,那么在Enumerable<Person>
遍历之前实际上不会对数据库进行查询(例如,通过将其转换为列表或数组或在循环中使用它foreach
),如下例所示:
var persons = gateway.SelectPersons();
// Dispose() is fired here
var personViewModels = (
from b in persons
select new PersonViewModel
{
Id = b.Id,
Name = b.Name,
Age = b.Age,
OrdersCount = b.Order.Count()
}).ToList(); // executes queries
在这个例子中,Dispose()
在设置之后立即被调用persons
,这是一个IEnumerable<Person>
,这是唯一一次被调用。
所以,三个问题:
- 这是如何运作的?已处置后,处置后仍如何
DataContext
查询数据库以获取结果?DataContext
- 实际上是做什么的
Dispose()
? - 我听说没有必要(例如,请参阅此问题)处置 a
DataContext
,但我的印象是这不是一个坏主意。有什么理由不处理 DbLinqDataContext
吗?