Есть что-то, что давно исказило меня в Entity Framework.Entity Framework, DBContext и использование() + async?
В прошлом году я написал большое приложение для клиента, использующего 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 никогда не показывают этого? Как вы используете асинхронные функции и правильно используете свой контекст?
Это тесно связано: [Контекст данных EF - Async/Await & Multithreading] (http://stackoverflow.com/questions/20946677/ef-data-context-async-await-multithreading) – Noseratio