Я использую базовый контроллер, который предоставляет DataBase
свойство, доступное производным контроллерам.
public abstract class BaseController : Controller
{
public BaseController()
{
Database = new DatabaseContext();
}
protected DatabaseContext Database { get; set; }
protected override void Dispose(bool disposing)
{
Database.Dispose();
base.Dispose(disposing);
}
}
Все контроллеры в моем приложении являются производными BaseController
и используются следующим образом:
public class UserController : BaseController
{
[HttpGet]
public ActionResult Index()
{
return View(Database.Users.OrderBy(p => p.Name).ToList());
}
}
Теперь отвечу на ваши вопросы:
Когда мне следует создать новый DbContext / должен ли я иметь один глобальный контекст, который я передаю?
Контекст должен создаваться для каждого запроса. Создайте контекст, сделайте с ним то, что вам нужно, а затем избавьтесь от него. С решением базового класса, которое я использую, вам нужно беспокоиться только об использовании контекста.
Не пытайтесь использовать глобальный контекст (веб-приложения так не работают).
Могу ли я иметь один глобальный контекст, который можно использовать повсюду?
Нет, если вы сохраните контекст, он будет отслеживать все обновления, добавления, удаления и т. Д., И это замедлит работу вашего приложения и может даже вызвать некоторые довольно тонкие ошибки в вашем приложении.
Вам, вероятно, следует выбрать либо ваш репозиторий, либо ваш контекст для вашего контроллера, но не то и другое одновременно. Наличие доступа к двум контекстам из одного и того же метода приведет к ошибкам, если они оба имеют разные представления о текущем состоянии приложения.
Лично я предпочитаю раскрывать DbContext
напрямую, поскольку большинство примеров репозиториев, которые я видел, в DbContext
любом случае просто превращаются в тонкие оболочки .
Это вызывает снижение производительности?
Первое создание a DbContext
довольно дорого, но как только это было сделано, большая часть информации кэшируется, так что последующие экземпляры выполняются намного быстрее. у вас больше шансов увидеть проблемы с производительностью из-за сохранения контекста, чем из-за его экземпляра каждый раз, когда вам нужен доступ к своей базе данных.
Как все остальные это делают?
Это зависит.
Некоторые люди предпочитают использовать структуру внедрения зависимостей для передачи конкретного экземпляра своего контекста своему контроллеру при его создании. Оба варианта подходят. Мой больше подходит для небольшого приложения, когда вы знаете, что конкретная используемая база данных не изменится.
некоторые могут возразить, что вы не можете этого знать, и именно поэтому метод внедрения зависимостей лучше, поскольку он делает ваше приложение более устойчивым к изменениям. Мое мнение по этому поводу состоит в том, что это, вероятно, не изменится (SQL-сервер и Entity Framework вряд ли являются непонятными) и что мое время лучше всего потратить на написание кода, специфичного для моего приложения.