Когда выполнять Dispose контекста?

241
27 августа 2017, 02:00

Читаю код одного web-приложения (ASP.NET MVC). В нем для доступа к данным используется Entity Framework. Есть класс Repository который заключает в себе логику работы с EF. Сам DbContext создается "лениво" по первому обращению к нему. Класс Repository реализует интерфейс IDisposable, в котором происходит вот что:

public void Dispose()
{
    MyDbContext.SaveChanges();
    MyContext.Dispose();
}

То есть на протяжении работы с репозиторием вплоть до его Dispose изменения в бд накапливаются, а сохраняются уже при вызове Dispose. Сам же репот\зиторий диспозится по окончании запроса:

protected void Application_EndRequest(object sender, EventArgs e)
{
    try
    {           
        Repository.Dispose();
    }
    catch (Exception ex)
    {
        Log.Error(ex.ToString());
    }
}

Вроде бы логично - во время жизни запроса жив и репозиторий, и он накапливает изменения в бд, а по окончании запроса изменения пишутся в бд. Вроде бы логично - мы не дергаем на каждый чих метод SaveChanges, а пишем всё один раз (при необходимости сделать изменения здесь и сейчас такая возможность тоже есть).

Однако везде я вижу вот такое использование контекста:

using(var ctx = new DbContext())
{
    // код работы с бд
}

То есть контекст диспозится сразу же, и сразу же сохраняются изменения. То есть подхода, описанного выше, я нигде, кроме как в этом коде не видел. Насколько он правилен и нет ли у него каких-то недостатков по сравнению с использованием using сразу же?

READ ALSO
Запрет выделения ячейки в ListView. WPF

Запрет выделения ячейки в ListView. WPF

Есть самый простой ListView в котором 1000+ записейМне нужно использовать это как список Items, чтобы Items не выделялись и при нажатии на стрелки не обводились...

358
Что такое стек и куча?

Что такое стек и куча?

Я изучаю C# и пытаюсь понять что такое стек и кучаВ большинстве примеров, стек подается как массив у которого есть функции push() и pop()

458
Задержка секундомера

Задержка секундомера

Создал бесконечный секундомер который отсчитывает от 5 до 0, а когда значение секундомера доходит до нуля, начинает считать заново:

249
действие при вылете приложения

действие при вылете приложения

Как выполнить код (к примеру запустить CrashReporterexe) в случае вылета приложения?

228