Как вы проверяете соединения открытой сущности
В Entity Framework 5 с VS2012/VS2013. C#
Учитывая следующее:
using (modelEntities context = new modelEntities())
{
//do stuff
context.Dispose();
}
Предполагается, что оператор using сам по себе вызывает Dispose(). Я все еще вызываю dispose для соединения, просто чтобы убедиться, что оно закрыто. Есть ли способ проверить, есть ли открытые соединения в моем проекте Visual Studio, работающем на localhost?
Редактировать: я поместил context.Dispose(); внутри блока использования. Вот как я хотел это показать. Теперь это скомпилируется.
1 ответ
DbContext имеет свойство Database типа IDbConnection, которое, в свою очередь, имеет свойство State типа System.Data.ConnectionState, которое является перечислением.
Значения для перечисления ConnectionState:
- Разорвано Соединение с источником данных разорвано. Это может произойти только после того, как соединение было открыто. Соединение в этом состоянии может быть закрыто, а затем вновь открыто. (Это значение зарезервировано для будущих версий продукта.)
- Закрыто Соединение закрыто.
- Соединение Объект соединения соединяется с источником данных.
- Выполнение Объект подключения выполняет команду. (Это значение зарезервировано для будущих версий продукта.)
- Выборка Объект подключения извлекает данные. (Это значение зарезервировано для будущих версий продукта.)
- Открыть Соединение открыто.
Однако простое получение доступа к базе данных DbContext.Database может фактически открыть соединение. Вам лучше было бы доверить использование оболочки для правильной утилизации вашего контекста, чем снова вызывать context.Dispose() просто потому, что код Microsoft, вероятно, был протестирован в гораздо большей степени, чем ваш или мой когда-либо.
Если вам абсолютно необходимо явно убедиться, что соединение закрыто, вы можете переопределить метод Dispose вашего контекста и вызвать
context.Close();
который
закрывает соединение с базой данных. Это предпочтительный метод закрытия любого открытого соединения.
Вызывая context.Dispose снова после оператора using, вы в основном сообщаете всем, кто читает ваш код, о том, что у вас есть / или возникла проблема, которую вы на самом деле не отлаживали, и что вы просто случайным образом вызываете код очистки, на который вы "надеетесь" " работает.
Изменить: Согласно комментарию это не будет даже компилировать из-за области. Я неверно истолковал ваш вопрос в этом отношении, если вы передаете контекст в хранилище или как часть единицы работы, как я обычно делаю это, а затем решаете закрыть свой контекст с помощью использования, тогда вы просто должны доверять этому это будет очищено согласно.