Управление соединениями и транзакциями (платформа Entity Framework)

По умолчанию Entity Framework управляет соединением с базой данных. Однако можно вручную управлять и соединениями, и транзакциями в собственном приложении Entity Framework .

Соединения и платформа Entity Framework

Entity Framework открывает соединения только по требованию, например чтобы выполнить запрос или вызвать метод SaveChanges, и закрывает соединение после завершения операции.

Вызов любого из следующих методов открывает соединение:

Bb896325.note(ru-ru,VS.100).gifПримечание
При вызове метода запроса соединение открывается и остается открытым, пока результат ObjectResult не станет ненужным.

Ручное управление соединениями

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

' Explicitly open the connection. 
context.Connection.Open()
// Explicitly open the connection.    
context.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 context As New AdventureWorksEntities(conn)
// Create an EntityConnection.
EntityConnection conn =
    new EntityConnection("name=AdventureWorksEntities");

// Create a long-running context with the connection.
AdventureWorksEntities context =
    new AdventureWorksEntities(conn);

Дополнительные сведения см. в разделе Как использовать класс EntityConnection с контекстом объекта (платформа Entity Framework).

Вопросы управления соединениями

При управлении соединениями следует принимать во внимание следующие моменты.

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

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

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

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

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

Транзакции и платформа Entity Framework

Платформа Entity Framework поддерживает автоматическое прикрепление транзакций. Это означает, что действия, выполняемые в контексте объекта, такие как выполнение запросов и сохранение изменений данных в источнике данных, могут быть изолированы в источнике данных путем выполнения операции внутри транзакции System.Transactions. Транзакции используются в Entity Framework для выполнения следующих задач.

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

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

Транзакции, требующие прикрепления дополнительных диспетчеров ресурсов, называются распределенными транзакциями. Чтобы управлять ресурсами, необходимыми для завершения транзакции, распределенные транзакции используют координатор распределенных транзакций (DTC). Повышение транзакции до уровня координатора распределенных транзакций может быть довольно дорогостоящим процессом. Некоторые диспетчеры ресурсов, такие как SQL Server 2005, позволяют использовать протокол транзакций Promotable Single Phase Enlistment (PSPE). Это позволяет диспетчеру ресурсов хранить транзакцию, которая впоследствии может быть укрупнена для управления координатором распределенных транзакций.

Дополнительные сведения о System.Transactions см. в разделе Transaction Processing. Дополнительные сведения об использовании System.Transactions c SQL Server см. в разделе System.Transactions Integration with SQL Server (ADO.NET).

Вопросы управления транзакциями

При использовании транзакций с Entity Framework необходимо учитывать следующие замечания.

  • В состав транзакции могут входить только операции, относящиеся к источнику данных. Изменения, внесенные в объекты в контексте объекта, в транзакции не включаются. Изменения объектов в контексте видимы вне области транзакции.

  • Если текущая транзакция существует при вызове метода SaveChanges, Entity Framework использует эту транзакцию для выполнения операций с источником данных. Иначе службы создают новую транзакцию для этой операции. Определить транзакции можно с помощью элементов EntityTransaction, Transaction или TransactionScope.

    Bb896325.note(ru-ru,VS.100).gifПримечание
    Чтобы выполнить прикрепление в существующей транзакции, Entity Framework может закрывать и повторно открывать соединение.

  • Когда Entity Framework создает новую транзакцию для операции SaveChanges, изменения объектов в контексте объекта не принимаются до завершения этой транзакции. Это обеспечивает согласованность состояния контекста объекта и источника данных.

  • Продвижение транзакции в DTC может происходить при каждом закрытии и повторном открытии соединения в пределах одной транзакции. Поскольку Entity Framework открывает и закрывает соединение автоматически, следует иметь в виду вариант с закрытием и повторным открытием соединения для избежания продвижения транзакции. Дополнительные сведения см. в разделе Как открыть соединения вручную из контекста объекта (платформа Entity Framework).

  • При планировании повторного выполнения операций в рамках транзакции необходимо убедиться, что состояние объектов в контексте не было сброшено до завершения транзакции. Для этого нужно вызвать метод SaveChanges со значением false для параметра acceptChangesDuringSave, а затем вызывать метод AcceptAllChanges лишь после успешного завершения других операций в рамках транзакции. Дополнительные сведения см. в разделе Как управлять транзакциями на платформе Entity Framework.

При повторной попытке выполнить операцию с координируемыми транзакциями можно второй раз вызвать метод SaveChanges без предварительного вызова метода AcceptAllChanges. В этом случае Entity Framework пытается повторно применить те же самые измения к источнику данных.

В этом разделе

Как открыть соединения вручную из контекста объекта (платформа Entity Framework)

Как управлять соединением в длительно существующем контексте объекта (платформа Entity Framework)

Как использовать класс EntityConnection с контекстом объекта (платформа Entity Framework)

Как управлять транзакциями на платформе Entity Framework