Срок службы подключения к базе данных внедрения зависимостей EFCore - PullRequest
0 голосов
/ 07 января 2020

Попытка начать использовать EFCore вместо EF 6, и мне трудно понять, как происходит жизненный цикл базы данных при использовании внедрения зависимостей для моего контекста БД.

В EF 6 я знаком с ручным открытием моего соединения и использованием его метода dispose с помощью операторов. Мне кажется довольно ясным, как жизненный цикл БД реагирует таким образом.

(using var db = new DatabaseContext())
{}

С EFCore, я понимаю, рекомендуемый способ - добавить класс контекста db в качестве службы при запуске

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

Затем получить контекст в контроллере с помощью внедрения зависимостей

    private readonly ApplicationDbContext context;

    public HomeController(ApplicationDbContext context, ILogger<HomeController> logger)
    {
        this.context = context;
    }

Таким образом, когда начинается пул соединений? Когда мое соединение открыто и какова продолжительность жизни этого соединения? Открывает ли оно соединение при запуске приложения и закрывается при остановке? Открывается ли он при нажатии метода контроллера (если используется mvc)? При активном запросе?

Я нашел краткую ссылку на подсказку о том, что происходит за кулисами в документации SF Core 2.0, когда он представил пул DBContext.

"Шаблон basi c для использование EF Core в приложении ASP. NET Core обычно включает в себя регистрацию пользовательского типа DbContext в системе внедрения зависимостей и последующее получение экземпляров этого типа через параметры конструктора в контроллерах. Это означает, что создается новый экземпляр DbContext для каждый запрос. "

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0

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

Может кто-нибудь помочь мне понять срок службы соединения с базой данных при использовании этого шаблона? Если это дублирующий вопрос, пожалуйста, помогите пометить и указать мне, где я могу прочитать подробно. Я потратил некоторое время на исследования, но кажется, что все статьи, которые я могу найти, просто затушевывают это, или я могу искать с неправильными ключевыми словами.

1 Ответ

1 голос
/ 07 января 2020

По умолчанию отдельный DbContext будет создаваться и использоваться для каждого HTTP-запроса. Соединение можно открывать и закрывать много раз в течение срока жизни DbContext, но если DbContext начинает транзакцию, то же базовое соединение останется открытым и будет повторно использовано в течение всего срока транзакции.

При создании DbContext не инициализируется немедленно, и его соединение не открывается немедленно.

Метод расширения AddDbContext регистрирует типы DbContext с временем жизни scoped по умолчанию.

Это защищен от проблем одновременного доступа в ASP. NET Базовых приложениях, поскольку существует только один поток, выполняющий каждый клиентский запрос в данный момент времени, и потому что каждый запрос получает отдельную область внедрения зависимостей (и, следовательно, отдельный экземпляр DbContext).

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

Неявное совместное использование экземпляров DbContext между несколькими потоками vi внедрение зависимости

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...