Подтвердить что ты не робот

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();
}

Вопросы:

  1. Как правильно использовать переменную DBcontext?
  2. Что если мы не будем usage выражение " usage " (потому что оно влияет на производительность) - GC сделает все для этого?

Я новичок в использовании EF и до сих пор не нашел однозначного ответа на этот вопрос.

4b9b3361

Ответ 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 и вызовы удаляются в наконец, блок.