Ну, после еще нескольких копаний я наткнулся на этот пост:
http://stephenwalther.com/blog/archive/2008/08/20/asp-net-mvc-tip-34-dispose-of-your-datacontext-or-don-t.aspx
и в разделе комментариев Крейг Штунц писал:
Failing to Disposeобъект, который реализует IDisposable, обычно приводит к тому, что объект попадает в очередь финализации (подробнее см. главу 19 «Прикладное программирование Microsoft .NET Framework Джеффри Рихтера»).Результатом этого является то, что память объекта, которая в противном случае могла бы быть освобождена в поколении 01, будет освобождена до коллекции более позднего поколения.Если вы создаете много этих объектов, хорошо, сделайте математику.
Таким образом, вы всегда должны располагать любым объектом, который реализует IDisposable.
В случае контроллеров и DataContexts, это превращаетсяЭто действительно просто, потому что Controller также реализует IDisposable, и, следовательно, имеет виртуальный метод Dispose, который вы можете переопределить.Таким образом, вам не нужно оборачивать использование DataContext в использование.Вы можете создать его в конструкторе (или где угодно), а затем разместить в переопределенном Controller.Dispose.В этом случае использование IQueryable в представлении работает просто отлично, поскольку среда не удаляет контроллер до тех пор, пока представление не будет отображено.
Итак, я сделал то, что предложил Крейг, и переопределил метод Dispose, чтобыController
наследует.
В верхней части моего кода контроллера:
Repository repository;
// Default Contructor
public MyController()
{
repository = new Repository();
}
protected override void Dispose(bool disposing)
{
repository.Dispose();
}
и в моем репозитории у меня есть метод с именем Dispose, который выглядит следующим образом:
public void Dispose()
{
db.Dispose();
}
где db - мой DataContext
.
Теперь мой переопределенный метод Dispose вызывается каждый раз :), и мне не нужно оборачивать все свои ActionResult
при использовании блоков