C # Linq-to-Sql - следует ли удалять DataContext с помощью IDisposable

У меня есть несколько методов, которые работают с БД, и все они начинаются с вызова

FaierDbDataContext db = new FaierDbDataContext();

Поскольку объект Linq2Sql DataContext реализует IDisposable, следует ли его использовать с "using"?

using (FaierDbDataContext db = new FaierDbDataContext()) {
    // use db here
}

Каковы последствия того или иного его использования?


person Kornelije Petak    schedule 04.05.2009    source источник
comment
Кроме того, примечание: для людей, использующих LINQ, вы не должны хранить переменную экземпляра вашего контекста данных для своего класса модели данных. Вместо этого объявляйте его каждый раз, когда вам нужно в своих методах.   -  person mmcdole    schedule 04.05.2009


Ответы (1)


В отличие от большинства типов, реализующих IDisposable, DataContext на самом деле не требует удаления - по крайней мере, в большинстве случаев. Я спросил Мэтта Уоррена об этом дизайнерском решении, и вот его ответ:

Мы внедрили IDisposable по нескольким причинам:

  • Если логика приложения должна удерживать сущность за пределами того момента, когда DataContext будет использоваться или действителен, вы можете принудительно применить этот контракт, вызвав Dispose. Отложенные загрузчики в этой сущности по-прежнему будут ссылаться на DataContext и попытаются использовать его, если какой-либо код попытается перейти по отложенным свойствам. Эти попытки потерпят неудачу. Dispose также заставляет DataContext сбрасывать свой кэш материализованных сущностей, чтобы одна кешированная сущность не могла случайно сохранить в живых все сущности, материализованные через этот DataContext, что в противном случае могло бы вызвать утечку памяти.
  • Логику, которая автоматически закрывает соединение DataContext, можно обмануть, оставив соединение открытым. DataContext полагается на код приложения, который перечисляет все результаты запроса, поскольку при достижении конца набора результатов соединение закрывается. Если приложение использует метод IEnumerable MoveNext вместо оператора foreach в C # или VB, вы можете преждевременно выйти из перечисления. Если в вашем приложении возникают проблемы с подключениями, которые не закрываются, и вы подозреваете, что автоматическое закрытие не работает, вы можете использовать шаблон Dispose в качестве временного решения.

из источника

person Sadegh    schedule 04.05.2009