Administrar conexiones y transacciones (Entity Framework)

De forma predeterminada, Entity Framework administra la conexión con la base de datos. Sin embargo, puede administrar manualmente tanto las conexiones como las transacciones en su aplicación de Entity Framework .

Conexiones y Entity Framework

Entity Framework abre las conexiones solamente cuando es necesario; por ejemplo, para ejecutar una consulta o para llamar a SaveChanges, y después cierra la conexión cuando la operación se ha completado.

Al llamar a cualquiera de los métodos siguientes, se abre la conexión:

Bb896325.note(es-es,VS.100).gifNota:
Cuando se llama a un método de consulta, se abre la conexión y sigue estando abierta hasta que ObjectResult se haya consumido completamente o eliminado.

Administrar las conexiones manualmente

Entity Framework expone el objeto EntityConnection a través de la propiedad Connection. Esto le permite administrar la conexión y las transacciones, o proporcionar su propia EntityConnection. Resulta útil si desea mantener abierta una conexión dentro de un contexto del objeto de corta duración para mejorar el rendimiento o controlar las transacciones explícitamente. La misma conexión de proveedor utilizada por Entity Framework se puede compartir con otras partes de una aplicación. En el ejemplo siguiente, se muestra cómo abrir explícitamente una conexión:

' Explicitly open the connection. 
context.Connection.Open()
// Explicitly open the connection.    
context.Connection.Open();

Para obtener más información, vea Cómo abrir manualmente la conexión desde el contexto del objeto (Entity Framework).

Cuando se abre manualmente la conexión en un contexto del objeto de larga duración, debe llamar al método Dispose para asegurarse de que la conexión se cierre cuando el contexto ya no se necesita. También puede llamar al método Close sobre el objeto EntityConnection para cerrar explícitamente la conexión. Para obtener más información, vea Cómo administrar la conexión en un contexto del objeto de larga duración (Entity Framework).

También puede crear una EntityConnection y proporcionar esta conexión al contexto del objeto. En este caso, puede abrir la conexión manualmente o permitir que el contexto del objeto la abra cuando lo necesite. Cuando proporcione EntityConnection el contexto del objeto, debe asegurarse de que el contexto y la EntityConnection se eliminan cuando ya no se requieren. En el ejemplo siguiente se crea una conexión y se pasa al contexto del objeto:

' 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);

Para obtener más información, vea Cómo usar EntityConnection con un contexto del objeto (Entity Framework).

Consideraciones para administrar conexiones

Al administrar las conexiones deben tenerse en cuenta las consideraciones siguientes:

  • El contexto del objeto abrirá la conexión si no está ya abierta antes de una operación. Si el contexto del objeto abre la conexión durante una operación, siempre la cerrará cuando la operación se complete.

  • Si abre la conexión manualmente, el contexto del objeto no la cerrará. Al llamar a Close o Dispose, se cerrará la conexión.

  • Si el contexto del objeto crea la conexión, siempre se eliminará cuando se elimine el contexto.

  • En un contexto del objeto de ejecución prolongada, debe asegurarse de que se elimine el contexto cuando ya no se requiera.

Si proporciona una EntityConnection abierta para el contexto del objeto, debe asegurarse de su eliminación.

Transacciones y Entity Framework

Entity Framework admite la inscripción automática de transacciones. Esto significa que las actividades realizadas dentro de un contexto del objeto, como ejecutar consultas y guardar los cambios de los datos en el origen de datos, se pueden aislar en dicho origen de datos ejecutando la operación dentro de una transacción System.Transactions. Las transacciones se utilizan en Entity Framework para realizar las siguientes acciones:

  • Ejecutar varias operaciones en el origen de datos; estas deben ser coherentes, como realizar consultas que dependan de la realización correcta de cambios en los objetos.

  • Coordinar los cambios en el contexto del objeto con otras operaciones distribuidas, como enviar una notificación de correo electrónico o escribir en una cola de mensajes.

Las transacciones que requieren la inscripción de administradores de recursos adicionales se denominan transacciones distribuidas. Las transacciones distribuidas utilizan un coordinador de transacciones distribuidas (DTC) para administrar los recursos que se necesitan para completar la transacción. La promoción de una transacción a un DTC puede ser un proceso relativamente difícil de establecer y completar. Algunos administradores de recursos, como SQL Server 2005, admiten el protocolo de transacciones PSPE (Promotable Single Phase Enlistment). Esto permite a un administrador de recursos hospedar una transacción que se pueda escalar posteriormente para ser administrada por el coordinador de transacciones distribuidas (DTC), si es necesario.

Para obtener más información acerca de System.Transactions, vea Transaction Processing. Para obtener más información sobre cómo utilizar System.Transactions con SQL Server, vea System.Transactions Integration with SQL Server (ADO.NET).

Consideraciones para administrar transacciones

Las consideraciones siguientes son aplicables cuando se utilizan transacciones con Entity Framework :

  • Solo las operaciones con el origen de datos son susceptibles de transacción. Los cambios realizados en los objetos del contexto del objeto no son susceptibles de transacción. Los cambios efectuados en objetos del contexto están visibles fuera del ámbito de la transacción.

  • Al llamar a SaveChanges, si existe una transacción actual, Entity Framework utiliza esta transacción para las operaciones realizadas con el origen de datos. De lo contrario, crea una transacción nueva para la operación. Puede definir transacciones utilizando EntityTransaction, Transaction o TransactionScope.

    Bb896325.note(es-es,VS.100).gifNota:
    Para dar de alta una transacción existente, Entity Framework puede cerrar y volver a abrir la conexión.

  • Cuando Entity Framework crea una transacción nueva para una operación SaveChanges, los cambios efectuados en los objetos del contexto del objeto no se aceptan hasta que se complete la transacción. De este modo, se garantiza que el estado del contexto del objeto y el origen de datos son coherentes.

  • La promoción de una transacción a un DTC se puede producir cuando una conexión se cierra y se vuelve a abrir dentro de una única transacción. Dado que Entity Framework abre y cierra la conexión automáticamente, debería considerar su apertura y cierre manualmente para evitar la promoción de la transacción. Para obtener más información, vea Cómo abrir manualmente la conexión desde el contexto del objeto (Entity Framework).

  • Si tiene previsto volver a intentar operaciones en una transacción, debe asegurarse de que el estado de los objetos del contexto no se establezca de nuevo antes de completarse la transacción. Para ello, debe llamar a SaveChanges con el valor false para el parámetro acceptChangesDuringSave y, a continuación, llamar a AcceptAllChanges únicamente después de que otras operaciones de la transacción se hayan completado de forma correcta. Para obtener más información, vea Cómo: Administrar transacciones en Entity Framework.

Como parte de una operación de reintento con transacciones coordinadas, puede llamar a SaveChanges una segunda vez sin llamar primero a AcceptAllChanges. En este caso, Entity Framework intentará volver a aplicar los mismos cambios en el origen de datos.

En esta sección

Cómo abrir manualmente la conexión desde el contexto del objeto (Entity Framework)

Cómo administrar la conexión en un contexto del objeto de larga duración (Entity Framework)

Cómo usar EntityConnection con un contexto del objeto (Entity Framework)

Cómo: Administrar transacciones en Entity Framework