Когда открываются подключения к базе данных для DbContext при использовании DI

Насколько я понимаю, когда вы регистрируете DbContext с помощью AddDbContext, он регистрируется как время жизни с заданной областью действия, что означает один DbConnext для каждого HTTP-запроса. И что вам не нужно использовать оператор using, потому что соединение будет закрыто и очищено для вас, если вы не выполняете длительные вызовы базы данных. Но когда открывается соединение с базой данных? Открывает/закрывает ли он соединение автоматически после каждого вызова базы данных или соединение открывается во время внедрения DbContext в службу и закрывается после завершения запроса?

Причина, по которой я спрашиваю, заключается в том, что я переписываю существующее приложение, которое использует как классический asp, так и ASP.NET 4.8 (с использованием EF и корпоративной библиотеки данных Microsoft). Я ранее реализовал репозитории/сервисы и имел DbContext в репозитории, где все вызовы в этом репозитории использовали EF. Другие репозитории используют операторы sql с помощью dapper. Меня попросили удалить репозитории и использовать наш старый метод создания отдельных файлов DataAccess (каждый из которых реализует один и тот же разделяемый класс) и назвать их на основе используемой базы данных, а не функциональности. Мне действительно не нравится эта идея, потому что у нас есть проекты, в которых есть сотни вызовов базы данных в одном файле, потому что они используют одну и ту же базу данных (некоторые даже используют несколько баз данных), и в итоге мы получаем очень похожие/одинаковые методы доступа к данным. но названы иначе. Я реорганизовал репозитории, чтобы следовать этому шаблону. Поскольку все файлы реализуют один и тот же частичный класс, мне пришлось внедрить DbContext в конструктор; который не будет использовать хороший патрон вызовов базы данных. После этого я начал задаваться вопросом, будут ли вызовы, которые не используют EF, теперь иметь дополнительное открытое соединение с БД без всякой причины.

1 ответ

Но когда открывается соединение с базой данных?

Отсюда мы видим :

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

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

Он открывает соединение при загрузке или сохранении и закрывает его после завершения. Если вы форсируете его, запустив транзакцию и оставив ее открытой, соединение будет открыто в течение времени существования DbContext.

см. это , чтобы узнать больше.

Другие вопросы по тегам