Создать контекст сущности в классе constrctor? или создать его всякий раз, когда нужно его использовать?
Я работаю над проектом, который еще кто-то разработал. В проекте это имеет
public class HomeController : Controller
{
public HomeController() {
_EntitiesContext = new EntitiesContext();
_UsersContext = new UsersContext();
}
public UsersContext _UsersContext { get; set; }
public EntitiesContext _EntitiesContext { get; set; }
......
Затем, когда ему понадобится запрос, он будет использовать этот контекст.
Обычно я делаю следующее: я не создаю эти контексты в HomeController (), вместо этого я создаю их, используя синтаксис .... всякий раз, когда они мне нужны. Я думаю, что это откроет соединение, сделает запрос, затем закроет соединение. в противном случае соединение будет всегда открытым. Если его используют слишком много людей, это может вызвать проблемы.
Я прав в этом? Я думаю, что читал это онлайн раньше, но не мог найти это больше.
Спасибо
2 ответа
Я думаю, что это откроет соединение, сделает запрос, затем закроет соединение.
Не совсем верно. ADO.NET использует connection pool
, Таким образом, фактическое соединение с базой данных не открывается, оно берется из пула соединений. И когда вы вызываете Dispose для DbContext, он не закрывает соединение. Он просто возвращает его в пул, чтобы его можно было использовать позже. Так что не бойтесь оборачивать экземпляры DbContext в using
заявления.
Обычной практикой является создание одного контекста для каждого HTTP-запроса, а затем использование того же контекста там, где вам это нужно.
Самый жизнеспособный способ достичь этого - ввести EntitiesContext
зависимость (традиционно использующая конструктор) и самый простой способ ее внедрения с настроенным временем жизни объекта - это использование контейнера IoC.
Например (с помощью Microsoft Unity):
public HomeController(EntitiesContext context) {
_EntitiesContext = context;
}
И конфигурация контейнера (при инициализации приложения):
container.RegisterType<EntitiesContext>(new PerHttpRequestLifetime());