web-dev-qa-db-fra.com

Comment définir le délai d'expiration de la migration Entity Framework Core?

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?

16
Andrzej Gis

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

Définir le délai d'expiration des migrations ef .netcore

5
Peter

À 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

4
Colin

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);
}
1
Nishan Chathuranga