Зачем повторно инициировать DbContext при использовании Entity Framework? - PullRequest
36 голосов
/ 04 октября 2011

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

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

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

Ответы [ 2 ]

53 голосов
/ 04 октября 2011

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

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

Чем больше вы используете ObjectContextКак правило, чем больше это становится.Это потому, что он содержит ссылку на все сущности, о которых он когда-либо знал, по существу, на то, что вы запрашивали, добавляли или прикрепляли.Поэтому вам следует пересмотреть возможность совместного использования одного и того же ObjectContext на неопределенный срок.

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


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

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

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

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

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

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

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


Ресурсы

1 голос
/ 25 ноября 2014

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

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

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