Обновление - Ответ, очевидно, что DbLinq не реализует Dispose()
должным образом. D'о!Почему можно перечислить запрос DbLinq после вызова Dispose() в DataContext?
Ниже все рода заблуждение - Итог: 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()
Фактически? - Я слышал, что не нужно (например, см. this question) распоряжаться
DataContext
, но у меня сложилось впечатление, что это неплохая идея. Есть ли причина не, чтобы избавиться от DbLinqDataContext
?
Что делает метод 'repository.GetAll()'? Что он возвращает? –
@ Eclipsed4utoo, хороший вопрос. Я прокомментировал код. – devuxer