La conexión se cerró cuando se realiza la reversión de transacciones en MySQL con Entity Framework 6 y el proveedor de Devart

c# devart entity-framework-6 mysql transactions

Pregunta

Estoy trabajando en un proyecto que utiliza Entity Framework 6 RC para conectarse a una base de datos Mysql con el proveedor de Devart (v7.8.322.0).

Pero ahora me encuentro con un problema que cuando falla una consulta, la reversión de la transacción falla porque la conexión está cerrada.

No estamos iniciando ninguna transacción nosotros mismos.

Este es el stacktrace de la excepción:

    System.InvalidOperationException: Connection must be opened.
      at Devart.Common.Utils.CheckConnectionOpen(IDbConnection connection)
   at Devart.Data.MySql.MySqlConnection.Rollback()
   at Devart.Data.MySql.MySqlTransaction.Dispose(Boolean disposing)
   at System.Data.Common.DbTransaction.Dispose()
   at System.Data.Entity.Core.EntityClient.EntityTransaction.Dispose(Boolean disposing)
   at System.Data.Common.DbTransaction.Dispose()
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
   at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy)
   at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass28.<SaveChanges>b__25()
   at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options)
   at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   at System.Data.Entity.DbContext.SaveChanges()
   at Nallian.Dal.MySql.NallianDbContext.Nallian.Data.Common.Contracts.IUnitOfWork.SaveChanges() in c:\TFS2012\Nallian\Main\Nallian.Dal.MySql\NallianDbContext.cs:line 117
   ...

Aún más extraño es que cuando uso la herramienta devart dbmonitor, veo que la transacción se compromete.

Eché un vistazo en el código fuente abierto de Entity Framework y en ObjectContext.ExecuteInTransaction veo una llamada a ReleaseConnection () en la captura general. En ese método, la conexión se cierra si se determina que nadie más lo está utilizando. Pero en el bloque final, la transacción se elimina (también conocida como rollback).

Así que estoy un poco perdido aquí. ¿Puede alguien ayudarme con esto?

Gracias, Steven.

ACTUALIZACIÓN Construyo un pequeño proyecto de prueba con el RTM de EF6 y la última versión del proveedor de Devart 8.0.17 pero con el mismo resultado que el anterior.

También señalé mi proyecto de prueba a SqlServer Express y ahí funciona perfectamente. Así que creo que tengo que empezar a mirar al proveedor de Devart.

Respuesta aceptada

Descargué la nueva versión 8.1.45 de Devart DotConnect y esto resolvió el problema completamente. Ahora mis transacciones obtienen una reversión si alguna consulta en ellas recibe un error. Y obtengo la excepción correcta en mi estrategia de ejecución EF6.

Así se solucionó el problema. Gracias Devart. :)


Respuesta popular

Se solucionó el error relacionado con el error "La conexión debe estar abierta" al revertir una transacción si ya se había cerrado una conexión.

Se lanza la nueva versión de dotConnect para MySQL 8.1. Se puede descargar desde aquí (versión de prueba) o desde el Área de Usuarios Registrados (solo para usuarios con suscripción activa). Para más información, consulte nuestro foro .




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué