EF (структура сущности) использование выражения "using"
У меня есть проект на MVC. Мы выбрали EF для наших транзакций с БД. Мы создали несколько менеджеров для слоя BLL. Я нашел много примеров, где using
выражение " using
", т.е.
public Item GetItem(long itemId)
{
using (var db = new MyEntities())
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
}
Здесь мы создаем новый экземпляр DBcontext MyEntities()
. Мы используем " using
" для того, чтобы "обеспечить правильное использование IDisposable объектов".
Это только один метод в моем менеджере. Но у меня их больше десяти. Каждый раз, когда я вызываю любой метод из менеджера, я буду using
выражение " using
" и создаю еще один DBcontext в памяти. Когда сборщик мусора утилизирует их? Кто-нибудь знает?
Но есть альтернативное использование методов менеджера. Мы создаем глобальную переменную:
private readonly MyEntities db = new MyEntities();
и использовать DBcontext в каждом методе без выражения " using
". И метод выглядит так:
public Item GetItem(long itemId)
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
Вопросы:
- Как правильно использовать переменную DBcontext?
- Что если мы не будем
usage
выражение " usage
" (потому что оно влияет на производительность) - GC сделает все для этого?
Я новичок в использовании EF и до сих пор не нашел однозначного ответа на этот вопрос.
Ответы
Ответ 1
Я думаю, вы найдете много предложений, предлагающих этот стиль шаблона. Не только я, но и Хенк
Обработка DBContext
- Да, в идеале Использование операторов для подтипов DBContext
- Еще лучшие шаблоны Unit of Work, которые управляются с помощью использования, которые имеют контекст и располагают контекстом Только один из многих примеров UoW, этот из Tom Dykstra
- Менеджер работы отдела должен быть новым каждым запросом Http.
- Контекст НЕ является потокобезопасным, поэтому убедитесь, что каждый поток имеет свой собственный контекст.
- Пусть EF кэширует вещи за кулисами.
- Время создания тестового контекста. после нескольких запросов Http. У вас все еще есть проблема?
- Ожидайте проблемы при сохранении контекста в static. любой сопутствующий доступ может повредить, и если вы используете параллельные вызовы AJAX, предположите, что 90%% проблем при использовании статического единого контекста.
Для некоторых советов по производительности, стоит прочитать
Ответ 2
Правильный или лучший способ использования переменной DBContext - с использованием.
using (var db = new MyEntities())
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
Преимущество - это то, что многое делается автоматически для нас. Например, как только блок кода будет завершен, вызывается dispose.
Per MSDN EF Работа с DbContext
Время жизни контекста начинается с создания экземпляра и заканчивается, когда экземпляр либо удален, либо собран в мусор. использование используя, если вы хотите, чтобы все ресурсы, которыми управляет контекст, расположенный в конце блока. Когда вы используете использование, компилятор автоматически создает блок try/finally и вызовы удаляются в наконец, блок.