Управление соединениями в службах объектов (платформа Entity Framework)
По умолчанию службы объектов управляют соединением с базой данных. Соединения открываются только по требованию, например чтобы выполнить запрос или вызвать метод SaveChanges. После завершения операции службы объектов закрывают соединение.
Вызов любого из следующих методов открывает соединение:
SaveChanges или Refresh в ObjectContext.
FirstOrDefault или First объекта ObjectQuery.
Load объекта EntityCollection.
Load объекта EntityReference.
Любой метод LINQ или метод построителя запросов ObjectQuery, такой как Where, OrderBy или Select.
Примечание. При вызове метода запроса соединение открывается и остается открытым, пока результат ObjectResult не станет ненужным.
Службы объектов предоставляют доступ к сущности EntityConnection через свойство Connection. Это позволяет управлять соединением и транзакциями или предоставить собственное соединение EntityConnection. Это полезно, если нужно удерживать открытым соединение в краткосрочном контексте объекта, чтобы повысить производительность или явно управлять транзакциями. Соединение с поставщиком, используемое Entity Framework, можно совместно использовать и в других частях приложения.
При управлении соединениями следует принимать во внимание следующие соображения.
Контекст объекта откроет соединение, если оно не было открыто до операции. Если контекст объекта открывает соединение во время операции, то оно будет закрыто при завершении операции.
Если соединение открыто вручную, то контекст объекта не закроет его. Соединение будет закрыто при вызове метода Close или метода Dispose.
Если контекст объекта создает соединение, это соединение всегда удаляется после удаления объекта.
В продолжительном контексте объекта необходимо обеспечить удаление контекста, когда он перестанет быть нужным.
Если предоставить соединение EntityConnection для контекста объекта, то необходимо обеспечить его удаление.
В следующем примере показано, как явно открыть соединение:
' Explicitly open the connection.
advWorksContext.Connection.Open()
// Explicitly open the connection.
advWorksContext.Connection.Open();
Дополнительные сведения см. в разделе Как вручную открыть соединение из контекста объекта (платформа Entity Framework).
При открытии соединения вручную в продолжительном контексте объекта необходимо вызвать метод Dispose, чтобы закрыть соединение, когда контекст перестанет быть нужным. Можно также вызвать метод Close для объекта EntityConnection, чтобы явно закрыть соединение. Дополнительные сведения см. в разделе Как управлять соединением в длительно существующем контексте объекта (платформа Entity Framework).
Службы объектов также позволяют создать соединение EntityConnection и предоставить его контексту объекта. В этом случае можно открывать соединение вручную или предоставить контексту объекта право открывать его при необходимости. Если контексту объекта предоставлено соединение EntityConnection, необходимо обеспечить удаление как контекста объекта, так и соединения EntityConnection, когда они перестанут быть нужными. В следующем примере создается соединение и передается контексту объекта.
' Create an EntityConnection.
Dim conn As New EntityConnection("name=AdventureWorksEntities")
' Create a long-running context with the connection.
Dim advWorksContext As New AdventureWorksEntities(conn)
// Create an EntityConnection.
EntityConnection conn =
new EntityConnection("name=AdventureWorksEntities");
// Create a long-running context with the connection.
AdventureWorksEntities advWorksContext =
new AdventureWorksEntities(conn);
Дополнительные сведения см. в разделе Как использовать класс EntityConnection с контекстом объекта (платформа Entity Framework).