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

StackOverflow https://stackoverflow.com/questions/821574

Вопрос

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

FaierDbDataContext db = new FaierDbDataContext();

Поскольку объект Linq2SQL DataContext реализует IDisposable, следует ли использовать это с "использованием"?

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

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

Это было полезно?

Решение

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

Есть несколько причин, по которым мы внедрили IDisposable:

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

из самого Источник

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top