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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


Ресурсы

  • MSDN: как определить срок службы объекта ObjectContext
  • StackOverflow: создание экземпляра в LINQ для объектов

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

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

 public void WCFMethod() { using (DBContext db = new DBContext()) { BusinessLogic logic = new BusinessLogic(db); logic.DoWork(); } } 
  • OperationContext.Current имеет значение null после первого ожидания при использовании async / wait в службе WCF
  • Когда использовать атрибуты DataContract и DataMember?
  • Почему WCF возвращает myObject вместо List , как я ожидал?
  • Разница между ссылкой в ​​Интернете и ссылкой на обслуживание?
  • CryptographicException «Keyset не существует», но только через WCF
  • Отчеты в SOA (Business Intelligence & Service Oriented Architecture)
  • Как передать lambda-выражение в службу WCF?
  • jqGrid не заполняет данными
  • Как я могу установить сертификат в локальном хранилище программ с помощью c #?
  • WCF + REST: Где данные запроса?
  • Ведение журнала исключений для служб WCF с использованием ELMAH
  • Давайте будем гением компьютера.