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

Зачем повторно инициировать DbContext при использовании Entity Framework?

Я не знаю, есть ли лучший способ использовать DbContext, потому что , который не рекомендуется устанавливать, является статичным при работе с WCF. Поэтому мы создаем его каждый раз, когда хотим получить доступ к базе данных.

Зная все преимущества использования Entity Framework, some становятся бесполезными, поскольку мы каждый раз воссоздаем DbContext; и многое другое может вызвать накладные расходы, так как процесс создания моделей больших сущностей должен быть рассмотрен.

Каково ваше мнение?

4b9b3361

Ответ 1

Управление временем жизни

Вы правы, что один статический экземпляр DbContext обычно не рекомендуется:

Чем больше вы используете ObjectContext, тем больше он становится больше. Это связано с тем, что в нем содержатся ссылки на все Сущности, известно о, по сути, о том, что вы запросили, добавили или подключили. Таким образом, вы должны пересмотреть один и тот же объект ObjectContext неограниченно.

Эти комментарии относятся непосредственно к DbContext, поскольку он обертывает wraps ObjectContext, чтобы выставить "упрощенные и более интуитивные API". [см. документацию]


Стоимость строительства

Накладные расходы на создание контекста относительно низки:

Реальность такова, что стоимость на самом деле довольно низкая, потому что в основном это просто включает в себя копирование, путем ссылки, метаданные из глобального кеша в новый ObjectContext. Вообще я не думаю, что эта стоимость стоит беспокоиться о...

Обычный способ работы с недолговечным контекстом состоит в том, чтобы обернуть его в используемый блок:

using(DbContext context = new SomeDbContext())
{
    // Do work with context
}

Чтобы облегчить тестирование, вы можете захотеть, чтобы ваш DbContext реализовал некоторый интерфейс IDbContext и создал factory class ContextFactory<T> where T : IDbContext для создания контекстов.

Это позволяет легко заменить любой IDbContext на ваш код (т.е. контекст в памяти для объекта, издевающегося над).


Ресурсы

Ответ 2

Лучшей практикой для веб-разработки является "один контекст для веб-запроса", см. "Надлежащее управление жизненным циклом сеанса /DbContext" при работе с WCF это можно перевести в один контекст за операцию (т.е. один контекст для вызова метода WCF).

Существуют разные способы достижения этого, но одно решение, возможно, не рекомендуется по разным причинам, состоит в том, чтобы создать новый экземпляр контекста и передать его конструктору вашего бизнес-класса:

public void WCFMethod()
{
  using (DBContext db = new DBContext())
  {
    BusinessLogic logic = new BusinessLogic(db);
    logic.DoWork();
  }
}