Закрытие соединений явно в Entity Framework - PullRequest
14 голосов
/ 13 марта 2011

Чтение документации Microsoft http://msdn.microsoft.com/en-us/library/bb738684.aspx Я вижу, они явно открывают и закрывают соединение

using (EntityConnection conn = new EntityConnection("name=AdventureWorksEntities"))
{ 
    conn.Open();
    ...
    conn.Close();
}

зачем это нужно?

Ответы [ 2 ]

28 голосов
/ 13 марта 2011

Это не «нормальный» способ использования EF. EF обычно управляет соединением для вас. Тем не менее:

Управление соединениями в объектных службах (Entity Framework)

Object Services предоставляет EntityConnection посредством свойства Connection . Это позволяет вам управлять соединением и транзакциями или предоставлять собственную EntityConnection . Это полезно, когда вы хотите держать открытым соединение в недолговечном объектном контексте, чтобы повысить производительность или явно контролировать транзакции. То же соединение с провайдером, которое используется Entity Framework, может использоваться совместно с другими частями приложения.

При управлении соединениями действуют следующие соображения:

  • Контекст объекта откроет соединение, если оно еще не было открыто перед операцией. Если контекст объекта открывает соединение во время операции, он всегда закрывает соединение после завершения операции.

  • Если вы вручную откроете соединение, контекст объекта не закроет его. Вызов Close или Dispose закроет соединение.

  • Если контекст объекта создает соединение, соединение всегда будет удаляться при удалении контекста.

  • В контексте продолжительного объекта вы должны убедиться, что контекст удаляется, когда он больше не требуется.

  • Если вы предоставляете открытый EntityConnection для контекста объекта, вы должны убедиться, что он расположен.

Короче говоря, обычно вы не управляете соединением, но если вы хотите сделать это вручную по причинам, указанным выше, вы можете. Если вы решили открыть соединение вручную, вам нужно закрыть его вручную (EF не делает никаких предположений, если вы решите перейти вручную).

8 голосов
/ 13 марта 2011

Это не обязательно, потому что Dispose, вызванный с помощью оператора, будет обрабатывать его.Но это хорошая привычка явно вызывать Close, как только вы узнаете, что соединение больше не понадобится.Например, вы не знаете, насколько сложна утилизация, поэтому хотите как можно скорее освободить соединение с базой данных, обернутое соединением сущностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...