47

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

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 一起工作?

4

2 回答 2

63

PM> 安装包FluentMigrator.Tools

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

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

请注意,文件夹名称会因版本号而异,此插图使用当前的 1.6.1 版本。如果您需要 .NET 3.5 运行程序,请使用该\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。

于 2012-05-09T00:19:34.810 回答
5

我实际上已经在 application_start 中完成了运行迁移,但是很难从该代码中分辨出什么是错误的...由于它是开源的,我只需获取代码并将其拉入您的解决方案并构建它以找出问题所在Execute 方法在抱怨。我发现 Fluent Migrator 的源代码组织得很好。

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

于 2011-09-30T15:58:28.513 回答