Sto usando l'ultima versione (1.0.0) di EF Core. Ho una migrazione da eseguire su un database abbastanza grande.
Io corro:
aggiornamento del database dotnet ef -c ApplicationDbContext
E prendi:
Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell'operazione o il server non risponde.
Nella stringa di connessione imposto esplicitamente il timeout in questo modo:
Connect Timeout = 150000
Sfortunatamente, non è stato d'aiuto. Come dovrei farlo?
Il messaggio di errore che stai ricevendo è per un timeout di comando , non un timeout di connessione.
AGGIORNARE
Come menzionato da Pace nei commenti, dal momento che EF Core 2.0 è in grado di utilizzare IDesignTimeDbContextFactory
per modificare il comportamento del contesto quando viene creato dagli strumenti in fase di progettazione, come avviene con Migrations.
Creare una classe separata nel progetto che implementa l'interfaccia IDesignTimeDbContextFactory
e utilizzare DbContextoptionsBuilder
per configurare il comportamento desiderato, in questo caso, impostare il valore di timeout del comando su 600 secondi:
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);
}
}
}
Assicurati che il tuo DbContext
esistente abbia un costruttore che prende un oggetto DbContextOptions
come parametro:
public AdventureContext(DbContextOptions options) : base(options){}
Quando lo strumento esegue la migrazione, cerca prima una classe che implementa IDesignTimeDbContextFactory
e, se trovata, la utilizzerà per configurare il contesto. Il comportamento del runtime non è influenzato.
Risposta originale Non applicabile
Non è possibile impostare CommandTimeout
su un contesto quando si usano i comandi EF. Ma puoi impostarlo globalmente nel costruttore e quindi rimuoverlo in seguito se non hai bisogno di tenerlo:
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext()
{
Database.SetCommandTimeout(150000);
}
}
È possibile impostare il timeout per la migrazione solo impostando il timeout sul contesto prima di chiamare il metodo Migrations:
using (var context = new DispatchingDbContext(_configuration))
{
context.Database.SetCommandTimeout(300);
await context.Database.MigrateAsync().ConfigureAwait(false);
}