48 votes

Est-il possible d'utiliser fluent migrator dans application_start?

J'utilise couramment migrator pour gérer mon migrations de base de données, mais ce que je voudrais faire est de les migrations exécuter à l'application de démarrage. Le plus proche que j'ai réussi, c'est ce:

public static void MigrateToLatest(string connectionString)
{
    using (var announcer = new TextWriterAnnouncer(Console.Out)
                                {
                                    ShowElapsedTime = true,
                                    ShowSql = true
                                })
    {
        var assembly = typeof(Runner).Assembly.GetName().Name;

        var migrationContext = new RunnerContext(announcer)
        {
            Connection = connectionString,
            Database = "SqlServer2008",
            Target = assembly
        };

        var executor = new TaskExecutor(migrationContext);
        executor.Execute();
    }
}

Je suis sûr que j'ai eu ce travail, mais je n'ai pas regardé depuis un moment (projet de loisirs) et il est maintenant jeter référence null exceptions quand il arrive à l' Execute ligne de. Malheureusement, il n'y a pas de docs pour cela et j'ai été frapper ma tête depuis des siècles.

Quelqu'un a réussi à faire passer ce genre de chose à travailler avec FluentMigrator?

63voto

Maarten Points 956

Cela marche:

 public static class Runner
{
    public class MigrationOptions : IMigrationProcessorOptions
    {
        public bool PreviewOnly { get; set; }
        public string ProviderSwitches { get; set; }
        public int Timeout { get; set; }
    }

    public static void MigrateToLatest(string connectionString)
    {
        // var announcer = new NullAnnouncer();
        var announcer = new TextWriterAnnouncer(s => System.Diagnostics.Debug.WriteLine(s));
        var assembly = Assembly.GetExecutingAssembly();

        var migrationContext = new RunnerContext(announcer)
        {
            Namespace = "MyApp.Sql.Migrations"
        };

        var options = new MigrationOptions { PreviewOnly=false, Timeout=60 };
        var factory = new FluentMigrator.Runner.Processors.SqlServer.SqlServer2008ProcessorFactory();
        var processor = factory.Create(connectionString, announcer, options);
        var runner = new MigrationRunner(assembly, migrationContext, processor);
        runner.MigrateUp(true);
    }
}
 

Référence FluentMigrator.Runner.dll en plus de FluentMigrator.dll pour que cela fonctionne.

[ mettre à jour la nouvelle version de FluentMigrator a IDisposable sur le présentateur, tnx Andrew]

5voto

Benzilla Points 28

J'ai en fait accompli exécuter les migrations dans le application_start cependant, il est difficile de dire à partir de ce code, ce qui pourrait être mauvais... Car il est open source, je voudrais juste saisir le code et de le tirer vers votre solution et de le construire à savoir ce que la méthode Execute est de se plaindre. J'ai trouvé que le code source de Fluide Migrator est organisé assez bien.

Une chose que vous pourriez avoir à être préoccupé si c'est une application web est de s'assurer qu'aucune personne n'utilise la base de données pendant que vous procédez à la migration. J'ai utilisé la stratégie de l'établissement d'une connexion, la définition de la base de données en mode mono-utilisateur, l'exécution de l'migrations, la définition de la base de données en mode multi-utilisateur, la fermeture de la connexion. Ce gère également le scénario d'une charge équilibrée web application sur plusieurs serveurs afin de les 2 serveurs n'essayez pas d'exécuter les migrations à l'encontre de la même base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X