是否可以在application_start中使用流畅的迁移器?

时间:2011-09-27 19:07:47

标签: c# .net asp.net-mvc-3 fluent-migrator

我正在使用流畅的迁移器来管理我的数据库迁移,但我想要做的是让迁移在app start运行。我所管理的最接近的是:

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

我确信我有这个工作,但我暂时没有看过它(业余爱好项目),它现在在到达Execute行时抛出空引用异常。可悲的是,没有这方面的文件,而且我多年来一直在敲打它。

有没有人设法让这种东西与FluentMigrator合作?

2 个答案:

答案 0 :(得分:63)

  

PM>安装包FluentMigrator.Tools

手动添加对以下内容的引用:

packages\FluentMigrator.Tools.1.6.1\tools\AnyCPU\40\FluentMigrator.Runner.dll

请注意,文件夹名称因版本号而异,此插图使用当前的1.6.1版本。如果需要.NET 3.5 runner,请使用\35\目录。

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

        using (var processor = factory.Create(connectionString, announcer, options))
        { 
            var runner = new MigrationRunner(assembly, migrationContext, processor);
            runner.MigrateUp(true);
        }
    }
}

请注意SqlServer2008ProcessorFactory这是可配置的,具体取决于您的数据库,支持:2000,2005,2008,2012和2014.

答案 1 :(得分:5)

我实际上已经完成了在application_start中运行迁移,但很难从代码中判断出什么是错误的......因为它是开源的,我只需抓住代码并将其拉入您的解决方案并构建它以查找了解Execute方法所抱怨的内容。我发现Fluent Migrator的源代码组织得很好。

如果这是一个Web应用程序,您可能需要关注的一件事是确保在迁移时没有人使用数据库。我使用了建立连接,将数据库设置为单用户模式,运行迁移,将数据库设置为多用户模式,然后关闭连接的策略。这还处理多个服务器上的负载平衡Web应用程序的场景,因此2台服务器不会尝试针对同一数据库运行迁移。