stored framework expired commandtimeout entity-framework

expired - Modificar base de datos en Entity Framework 6



execution timeout expired c# entity framework (2)

EF 6 cambia el uso de transacciones con ExecuteSqlCommand

A partir de Entity Framework 6.0, ExecuteSqlCommand () de forma predeterminada envolverá el comando en una transacción si uno no estaba ya presente. Hay sobrecargas de este método que le permiten anular este comportamiento si lo desea.

EF 5 no se comportó de la misma manera. Su corrección es apropiada.

Ahora puede especificar un indicador TransactionalBehavior para instruir a EF sobre cómo manejar las transacciones con este comando.

var sqlCommand = String.Format("ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE"); db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, sqlCommand);

Al utilizar el indicador DoNotEnsureTransaction, EF no iniciará una transacción antes de ejecutar el comando. Esto permite que el comando ALTER DATABASE se ejecute con éxito.

He actualizado mi EF a EF 6.0.2 en mi código. Tengo la siguiente línea de código:

applicationDbContext.Database .ExecuteSqlCommand(@"ALTER DATABASE CURRENT SET RECOVERY FULL;");

Después de actualizar recibo el siguiente mensaje de error:

La instrucción ALTER DATABASE no está permitida dentro de una transacción de múltiples instrucciones.

He solucionado el problema con un comportamiento de Transctional como el siguiente código:

applicationDbContext.Database.ExecuteSqlCommand( TransactionalBehavior.DoNotEnsureTransaction, @"ALTER DATABASE CURRENT SET RECOVERY FULL;");

Mi pregunta:

  • ¿Por qué me sale este error con EF 6?
  • ¿Mi solución es una solución válida para el problema o un demonio que se esconde detrás de esta solución?
  • ¿Hay algún otro enfoque para resolver el problema?

¿¡Cualquier ayuda será apreciada!?


Si está utilizando el enfoque de Code First, la solución posible es

public partial class AlterDatabase : DbMigration { public override void Up() { Sql("ALTER DATABASE CURRENT SET RECOVERY FULL", true); } public override void Down() { } }