update remove onmodelcreating framework first eliminar code c# entity-framework entity-framework-core

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

Establecer tiempo de espera para migraciones ef .netcore


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