FluentMigrator две базы данных SQL - PullRequest
       82

FluentMigrator две базы данных SQL

0 голосов
/ 26 сентября 2019

Я работаю с двумя базами данных и хочу использовать для этого свободный мигратор.Это две базы данных SQL, которые могут находиться на разных серверах и иметь разные строки подключения.У них разные таблицы и данные.Но у меня только один стартап и один проект.Я хочу указать для каждой миграции используемую базу данных.Как я могу справиться с этим?В настоящее время я пытаюсь решить его с помощью атрибутов, но я не уверен, работает ли он как-то:

public class MyAttribute : Attribute
{
    public MyAttribute(string name)
    {
        Name = name;
    }

    public string Name;
}

[MyAttribute("Database1")]
[Migration(1)]
public class FooScript : Migration
{
    public override void Down()
    {
        Delete.Table("Foo");
    }

    public override void Up()
    {
        Create.Table("Foo")
            .WithColumn("id").AsInt16().PrimaryKey()
            .WithColumn("Body").AsString(4000).NotNullable();
    }
}

И при запуске:

        services.AddFluentMigratorCore()
            .ConfigureRunner(rb => rb
                .AddSqlServer()
                .WithGlobalConnectionString("")
                .ScanIn(typeof(database1).Assembly, typeof(database1).Assembly).For.Migrations())
            .Configure<ProcessorOptions>(x =>
            {
                var connection = typeof(FooScript).GetCustomAttributes(typeof(MyAttribute), true);
                var name = "0"; //here I would need the current executing Migration class
                switch (name)
                {
                    case "Database1":
                        x.ConnectionString = Configuration.GetConnectionString("Database1");
                        break;
                    case "Database1":
                        x.ConnectionString = Configuration.GetConnectionString("Database1");
                        break;
                }
            })
            .BuildServiceProvider();

Но это не такработай.Мне понадобится атрибут текущего скрипта для перезаписи базы данных.Но у proucessorOptions таких нет.Есть ли другое решение или другая конфигурация, которую я мог бы перезаписать?Любые другие идеи, как я могу запустить fluentmigration с двумя или более различными базами данных SQL?

Теоретически я бы в конечном итоге с VersionInfo для каждой базы данных и текущей миграции для этой базы данных.Надеюсь, что это работает.

1 Ответ

0 голосов
/ 26 сентября 2019

Ну, иногда это проще, чем вы думаете.Для всех с таким же вопросом:

startup.cs

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
    {
        //...
        Migration();
    }

    private void Migration()
    {
        var serviceProviderDb1 = new ServiceCollection()
        .AddFluentMigratorCore()
        .ConfigureRunner(rb => rb
            .AddSqlServer()
            .WithGlobalConnectionString(Configuration.GetConnectionString("Database1"))
            .ScanIn(typeof(DB1Context).Assembly).For.Migrations())
        .Configure<RunnerOptions>(opt => {
            opt.Tags = new[] { "Database1" };
        })
        .BuildServiceProvider(false);

        using (var scope = serviceProviderDb1.CreateScope())
        {
            var runner = serviceProviderDb1.GetRequiredService<IMigrationRunner>();
            runner.MigrateUp();
        }

        var serviceProviderDb2 = new ServiceCollection()
            .AddFluentMigratorCore()
            .ConfigureRunner(rb => rb
                .AddSqlServer()
                .WithGlobalConnectionString(Configuration.GetConnectionString("Database2"))
                .ScanIn(typeof(DB2Context).Assembly).For.Migrations())
                .Configure<RunnerOptions>(opt => {
                    opt.Tags = new[] { "Database2" };
                })
            .BuildServiceProvider(false);

        using (var scope = serviceProviderDb2.CreateScope())
        {
            var runner = serviceProviderDb2.GetRequiredService<IMigrationRunner>();
            runner.MigrateUp();
        }
    }

А в файле миграции вам нужно только:

[Tags("Database1")]
[Migration(1)]
public class FooScript : Migration
{
}

Больше информации здесь: https://fluentmigrator.github.io/articles/migration/migration-filter-tags.html?tabs=runner-internal

Единственная неприятность в том, что вы не добавляете FluentMigration в свою коллекцию ServiceCollection и не можете использовать ее позже с внедрением зависимостей.Но, в основном, вы запускаете сценарии только при запуске, так что это не должно быть проблемой

...