C# FluentMigrator.Runner консольное приложение устанавливает транзакцию за сеанс - PullRequest
0 голосов
/ 04 февраля 2020

Я использую FlunetMigrator.Runner.3.2.1 и вижу, что эта версия больше не по умолчанию откатывает все миграции, если один из них завершился неудачно. Это говорит, что они за файл миграции! который не добавляет ценности. Есть ли способ установить транзакцию для каждого сеанса во время ее запуска в качестве основного консольного приложения. net.

Я вижу, что есть эта ссылка https://fluentmigrator.github.io/articles/runners/runner-console.html, но говорит, что используйте файл Migrate.exe, который мы не используем, мы используем консоль. Могу ли я установить уровень транзакции для сеанса в коде?

Зачем кому-то хотеть его запускать, и только некоторые изменения сделаны, Все или ничего - гораздо лучший подход

1 Ответ

1 голос
/ 04 февраля 2020

Я нашел ответ! Вы устанавливаете int в параметрах Runner, как показано ниже

opt.TransactionPerSession = true;

Полный метод, который создает IServiceProvide

private static IServiceProvider CreateServices(string connectionString,
    CommandLineArguments commandLineArguments)
{
    return new ServiceCollection()
        // Add common FluentMigrator services
        .AddFluentMigratorCore()
        .ConfigureRunner(rb => rb
            // Add SQL Server support to FluentMigrator
            .AddSqlServer()
            // Set the connection string
            .WithGlobalConnectionString(connectionString)

            // Define the assembly containing the migrations
            .ScanIn(typeof(Program).Assembly).For.Migrations().For.EmbeddedResources())
        // Enable logging to console in the FluentMigrator way
        .AddLogging(lb => lb.AddFluentMigratorConsole())
        .Configure<RunnerOptions>(opt => { 
            opt.Tags = commandLineArguments.Tags.ToArray();
            opt.TransactionPerSession = true; })
        // Build the service provider
        .BuildServiceProvider(false);
}

Приведенный ниже код является полным примером, который использует IServiceProvider

var serviceProvider = CreateServices(connectionString, commandLineArguments);

// Put the database update into a scope to ensure
// that all resources will be disposed.
using (var scope = serviceProvider.CreateScope())
{
    try
    {
        UpdateDatabase(scope.ServiceProvider, commandLineArguments);
    }
    catch (Exception e)
    {
        Console.WriteLine("There was a problem with the migration: " + e.Message + "\n" +
                          e.StackTrace);
    }
    migrationRun = true;
}

Код обновления базы данных:

private static void UpdateDatabase(IServiceProvider serviceProvider, CommandLineArguments commandLineArguments)
{
    // Instantiate the runner
    var runner = serviceProvider.GetRequiredService<IMigrationRunner>();

    if (commandLineArguments.Downgrade)
    {
        runner.MigrateDown(commandLineArguments.Version != -1 ? commandLineArguments.Version : 0);
    }
    else
    {
        if (commandLineArguments.Version != -1)
        {
            runner.MigrateUp(commandLineArguments.Version);
        }
        else
        {
            runner.MigrateUp();
        }

    }
}
...