J'utilise la dernière version (1.0.0) d'EF Core. J'ai une migration à exécuter sur une base de données assez grosse.
Je cours:
mise à jour de la base de données dotnet ef -c ApplicationDbContext
Et obtenir:
Le délai d'attente a expiré. Le délai d'attente s'est écoulé avant l'achèvement de l'opération ou le serveur ne répond pas.
Dans la chaîne de connexion, j'ai explicitement défini le délai d'attente de la manière suivante:
Délai de connexion = 150000
Malheureusement, cela n'a pas aidé. Comment dois-je faire cela?
Vous pouvez définir le délai d'expiration pour la migration uniquement en définissant le délai d'expiration sur le contexte avant d'appeler la méthode Migrations:
using (var context = new DispatchingDbContext(_configuration))
{
context.Database.SetCommandTimeout(300);
await context.Database.MigrateAsync().ConfigureAwait(false);
}
À l'aide d'Entity Framework 6, j'ai défini un délai plus long pour les migrations à l'aide de la propriété DbMigrationsConfiguration.CommandTimeout
.
Comme ça:
Dans mon Global.asax.cs:
protected void Application_Start()
{
DatabaseMigrationConfig.Register();
//etc
}
Ma classe 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);
}
}
}
Ma classe Migrations.Configuration
:
using System.Data.Entity.Migrations;
internal sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
CommandTimeout = 360;// <----- 6 minute timeout!
}
}
Références:
Migrations: erreur de délai d'attente dans les commandes Update-DatabaseDbMigrationsConfiguration.CommandTimeout, propriété
Notez que j'utilise également une chaîne de connexion différente lors des migrations: l'utilisateur dispose d'autorisations supérieures à celles du site Web et le délai de connexion est plus long. Voir cette question - Comment utiliser une chaîne de connexion différente (mais même base de données) pour les migrations
Vous pouvez également le faire dans le constructeur de votre classe de contexte de base de données.
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
Database.SetCommandTimeout(150000);
}