Соединение будет управляться автоматически. Однако существуют (или, по крайней мере, могут быть, как показывают комментарии) дополнительные ресурсы, связанные с DataContext. Эти ресурсы не будут освобождены, пока DataContext не будет уничтожен сборщиком мусора. Поэтому обычно лучше убедиться, что dispose вызывается, когда вам больше не нужен DataContext.
using (ProjDataContext db = new ProjDataContext()) {
bool hasPassword = (from p in db.tblSpecUser
where p.UserID == userId
select p.HasPassword).FirstOrDefault();
return hasPassword;
}
Здесь гарантируется, что db.Dispose()
вызывается при выходе из блока использования, тем самым явно закрывая соединение.
Редактировать: После обсуждения я посмотрел на DataContext избавиться (также с помощью Reflector) и нашел следующий код (FW 3.5), который вызывается из DataContext.Dispose
:
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (this.provider != null)
{
this.provider.Dispose();
this.provider = null;
}
this.services = null;
this.tables = null;
this.loadOptions = null;
}
}
Итак, есть ресурсов, которые освобождаются:
- Провайдер, который может хранить
DbConnection
, журнал (TextWriter
) и DbTransaction
.
- The
CommonDataServices
.
- Словарь таблиц.
-
LoadOptions
.
Поставщик может хранить ресурсы, которые необходимо утилизировать (DbConnection
и DbTransaction
). Кроме того, TextWriter
для журнала может потребоваться в зависимости от того, какой экземпляр TextWriter
пользователь назначил для механизма ведения журнала DataContext
, например, FileWriter, который затем автоматически закрывается.
Остальные свойства, насколько я понимаю, остаются в силе - не вдаваясь в подробности - только память, но это также делается доступным для сбора мусора методом dispose, однако оно не определяется, когда память фактически освобождается.
Итак, наконец, я полностью согласен с утверждением casparOne:
В общем, совместное использование таких ресурсов доступа к данным - плохая идея.
Вы должны создать свои ресурсы для доступа к БД, выполнить свои операции, а затем утилизировать их по завершении.