c# - remove - ¿Cómo configurar el tiempo de espera de la migración de Entity Framework Core?
remove migration entity framework core (4)
Estoy usando la última versión (1.0.0) de EF Core. Tengo una migración para ejecutar en una base de datos bastante grande.
Corro:
dotnet ef actualización de la base de datos -c ApplicationDbContext
Y obten:
Tiempo agotado. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde.
En la cadena de conexión establecí explícitamente el tiempo de espera así:
Tiempo de espera de conexión = 150000
Desafortunadamente, no ayudó. ¿Cómo debería hacer esto?
Con Entity Framework 6, establezco un tiempo de espera más largo para las migraciones con la propiedad DbMigrationsConfiguration.CommandTimeout
.
Me gusta esto:
En mi Global.asax.cs:
protected void Application_Start()
{
DatabaseMigrationConfig.Register();
//etc
}
Mi clase DatabaseMigrationConfig
:
public class DatabaseMigrationConfig
{
internal static void Register()
{
using (var context = new MyContext(Config.ConnectionStringMigrations))
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext,
Migrations.Configuration>());
context.Database.Initialize(false);
}
}
}
Mi clase de Migrations.Configuration
:
using System.Data.Entity.Migrations;
internal sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
CommandTimeout = 360;// <----- 6 minute timeout!
}
}
Referencias:
Migraciones: error de tiempo de espera en los comandos de actualización de la base de datos DbMigrationsConfiguration.CommandTimeout Property
Tenga en cuenta que también utilizo una cadena de conexión diferente durante las migraciones: el usuario tiene permisos más altos que el sitio web y el tiempo de espera de la conexión es más largo. Vea esta pregunta: cómo usar una cadena de conexión diferente (pero la misma base de datos) para las migraciones
El mensaje de error que está recibiendo es para un tiempo de espera de Comando , no para un tiempo de espera de conexión.
ACTUALIZAR
Como mencionó Pace en los comentarios, desde EF Core 2.0 puede usar IDesignTimeDbContextFactory
para cambiar el comportamiento de su contexto cuando se crea mediante herramientas en el momento del diseño, como sucede con las Migraciones.
Cree una clase separada en su proyecto que implemente la interfaz IDesignTimeDbContextFactory
y use DbContextoptionsBuilder
para configurar el comportamiento que desea, en este caso, establezca el valor de tiempo de espera del comando en 600 segundos:
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
namespace EFCoreSample.Model
{
public class SampleContextFactory : IDesignTimeDbContextFactory<SampleContext>
{
public SampleContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<SampleContext>();
optionsBuilder.UseSqlServer(@"Server=./;Database=db;Trusted_Connection=True;", opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds));
return new SampleContext(optionsBuilder.Options);
}
}
}
Asegúrese de que su DbContext
existente tenga un constructor que tome un objeto DbContextOptions
como parámetro:
public AdventureContext(DbContextOptions options) : base(options){}
Cuando las herramientas ejecutan la migración, primero busca una clase que implemente IDesignTimeDbContextFactory
y, si la encuentra, la usará para configurar el contexto. El comportamiento en tiempo de ejecución no se ve afectado.
Respuesta original ya no se aplica
No hay manera de configurar el CommandTimeout
en un contexto cuando se usan comandos EF.Pero puede configurarlo globalmente en el constructor, y luego eliminarlo más tarde si no necesita conservarlo:
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext()
{
Database.SetCommandTimeout(150000);
}
}
Puede establecer el tiempo de espera para la migración solo configurando el tiempo de espera en el contexto antes de llamar al método de Migraciones:
using (var context = new DispatchingDbContext(_configuration))
{
context.Database.SetCommandTimeout(300);
await context.Database.MigrateAsync().ConfigureAwait(false);
}
Puede hacerlo también en el constructor de su clase de contexto de base de datos.
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
Database.SetCommandTimeout(150000);
}