DbContext и пулы соединений

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

public BaseController()
    {
        db = new MyDbContext();

        db.Database.Log = s => Debug.Write(s);
    }

 public MyDbContext()
        : base("name=MyDbContext")
    {
        // hack to force Visual Studio to deploy the Entityframework.SqlServer package 
        var instance = SqlProviderServices.Instance;
    }

из-за того, как приложение было разработано, по крайней мере 2 контекста создаются для каждого запроса. (Это приложение MVC, и на каждой странице есть вызов HomeController плюс любые другие контроллеры, вызываемые для определенной страницы.)

мой вопрос в том, когда делает DbContext создать соединение с SQL Сервер? Это сразу же при создании контекста или только при выполнении запроса?

Если это первое, то я буду использовать 2 раза больше подключений к SQL server, чем необходимо, и если это последнее, то это, вероятно, не слишком большая проблема.

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

Entity Framework 6.1.3

3 ответов


поскольку вы не пытаетесь создать и передать соединение самостоятельно в конструкторе вашего контекста, тогда, да, как говорят другие, EF получит/освободит соединения из пула соединений по мере необходимости, а не когда он будет построен.

обратите внимание на эту цитату из документации EF:

подключения

по умолчанию, контекст управляет подключениями к базе данных. Контекст открывает и закрывает соединения по мере необходимости. Для например, контекст открывает соединение для выполнения запроса, а затем закрывает соединение после обработки всех результирующих наборов.

бывают случаи, когда вы хотите иметь больше контроля над тем, когда соединение открывается и закрывается. Например, при работе с SQL Server Compact Открытие и закрытие одного и того же соединения обходится дорого. Управлять этим процессом можно вручную с помощью свойства Connection.

см. следующие ссылки для получения дополнительной информации информация:

https://msdn.microsoft.com/en-us/data/jj729737

https://msdn.microsoft.com/en-us/data/dn456849


Entity Framework следует принципу открытия поздно и закрытия рано. Таким образом, он открывает соединение только тогда, когда ему тоже нужно, т. е. материализовать запрос, а затем закрывает его как можно скорее.

Если вы можете, вы должны перейти к одному экземпляру контекста для каждого запроса. Это также держит все, что происходит во время запроса в одной транзакции. Вы можете сделать это довольно легко, если вы используете контейнер внедрения зависимостей для создания ваших контроллеров.


соединение открывается только при выполнении запроса. Пул соединений управляется ADO.NET классы (SqlConnection). Наличие нескольких экземпляров DbContext на запрос нормально, а иногда и необходимо. У вас не будет в два раза больше соединений в целом.