Ответ 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
на ваш код (т.е. контекст в памяти для объекта, издевающегося над).