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

ili*_*ian 48 .net c# fluent-migrator asp.net-mvc-3

我正在使用流畅的迁移器来管理我的数据库迁移,但我想要做的是让迁移在应用程序启动时运行.我管理的最接近的是:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Maa*_*ten 63

PM> Install-Package FluentMigrator.Tools

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

packages\FluentMigrator.Tools.1.6.1\tools\AnyCPU\40\FluentMigrator.Runner.dll
Run Code Online (Sandbox Code Playgroud)

请注意,文件夹名称将因版本号而异,此插图使用当前的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 对于从NuGet安装FluentMigrator的任何人,FluentMigrator.Runner都在工具中,默认情况下不会引用. (3认同)
  • FluentMigrator.Runner也在FluentMigrator中.在包下,有一个工具目录(这是从v1.1.1.0开始. (2认同)

Ben*_*lla 5

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

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