Есть вещь, которая долгое время искала меня в Entity Framework.
В прошлом году я написал большое приложение для клиента, использующего EF. И во время разработки все отлично работало.
Мы отправили систему в августе. Но через несколько недель я начал видеть странные утечки памяти на производственном сервере. Мой процесс ASP.NET MVC 4 занимал все ресурсы машины после нескольких дней работы (8 ГБ). Это было плохо. Я просматриваю в сети и вижу, что вы должны окружать все ваши EF-запросы и операции в блоке using()
, чтобы контекст мог быть удален.
Через день я реорганизовал весь свой код для использования using()
, и это решило мои проблемы, так как тогда процесс сидит на устойчивом использовании памяти.
Причина, по которой я не окружала мои запросы, в первую очередь заключается в том, что я начал свои первые контроллеры и репозитории из собственных лесов Microsoft, включенных в Visual Studio, они не окружали его запросы с использованием, вместо этого у него был DbContext
как переменная экземпляра самого контроллера.
Прежде всего: если действительно важно избавиться от контекста (что-то, что не было бы странным, dbconnection
нужно закрыть и так далее), Microsoft, возможно, должна иметь это во всех их примерах!
Теперь я начал работать над новым крупным проектом со всеми моими знаниями в затылке, и я изучал новые возможности .NET 4.5 и EF 6 async
и await
. EF 6.0 имеет все эти асинхронные методы (например, SaveChangesAsync
, ToListAsync
и т.д.).
public Task<tblLanguage> Post(tblLanguage language)
{
using (var langRepo = new TblLanguageRepository(new Entities()))
{
return langRepo.Add(RequestOrganizationTypeEnum, language);
}
}
В классе TblLanguageRepo
:
public async Task<tblLanguage> Add(OrganizationTypeEnum requestOrganizationTypeEnum, tblLanguage language)
{
...
await Context.SaveChangesAsync();
return langaugeDb;
}
Однако, когда я теперь окружаю свои заявления в блоке using()
, я получаю исключение, DbContext was disposed
, прежде чем запрос сможет вернуться. Это ожидаемое поведение. Запрос выполняется async, а блок using
завершен перед запросом. Но как я должен правильно распоряжаться своим контекстом при использовании async и ждать функций ef 6??
Просьба указать мне в правильном направлении.
Требуется ли using()
в EF 6? Почему в примерах Microsoft никогда не упоминается? Как вы используете функции асинхронизации и правильно распоряжаетесь своим контекстом?