2011-07-19 24 views
12

Estoy tratando de reutilizar una conexión de base de datos existente para que pueda hacer varias operaciones de base de datos utilizando un TransactionScope sin invocar MSDTC.DbContext no mantendrá abierta la conexión para su reutilización

Entity Framework (utilizando la nueva API DbContext en la versión 4.1) no parece querer mantener abierta una conexión explícitamente abierta. La antigua API ObjectContext mantiene la conexión abierta como se esperaba y documented.

Dado que la API DbContext solo usa ObjectContext debajo del capó, esperaba el mismo comportamiento. ¿Alguien sabe si este cambio es intencionado o un problema conocido? No puedo encontrarlo documentado en ningún lado.

public void ConnectionRemainsOpen() 
{ 
    using (var context = new TestDataContext()) 
    { 
     try 
     { 
      Assert.AreEqual(ConnectionState.Closed, context.Database.Connection.State); 

      context.Database.Connection.Open(); 

      var firstRecord = context.Table3.FirstOrDefault(); 

      // this Assert fails as State == ConnectionState.Closed 
      Assert.AreEqual(ConnectionState.Open, context.Database.Connection.State); 

      var newRecord = new Table3 
      { 
       Name = "test", 
       CreatedTime = DateTime.UtcNow, 
       ModifiedTime = DateTime.UtcNow 
      }; 

      context.Table3.Add(newRecord); 

      context.SaveChanges(); 

      // this Assert would also fail 
      Assert.AreEqual(ConnectionState.Open, context.Database.Connection.State); 
     } 
     finally 
     { 
      if (context.Database.Connection.State == ConnectionState.Open) 
       context.Database.Connection.Close(); 
     } 
    } 
} 
+0

Si coloca un Assert after Open() pero antes de la primera consulta, ¿cuál es el resultado? Me pregunto si el problema aquí es que devuelve un valor incorrecto en lugar de cerrar y reabrir las conexiones. – Tridus

+0

@Tridus, el Assert que sugiere pasa con un resultado esperado de 'Abierto'. – GWB

+0

Me doy cuenta de que esta es una publicación anterior, pero estaba leyendo el libro de Julia Lerman y la sintaxis que usa es context.Connection.Open() (es decir, no hay una base de datos entre el contexto y la conexión). Solo un pensamiento. – Tod

Respuesta

14

Si desea controlar la conexión debe crearla antes del contexto y pasarla al contexto, de lo contrario la conexión no está bajo su control. Pruebe algo como:

+0

¿Este es un cambio documentado entre EF 4.0 y 4.1? – GWB

+0

Creo que está documentado porque el segundo parámetro del constructor indica si el contexto posee la conexión. –

+0

Intenté su solución pero obtuve el mismo resultado. El contexto aún cambia el estado de la conexión a su antojo. – GWB

Cuestiones relacionadas