protected void RunMigration(DatabaseConfiguration dbConfig, TagsConfiguration tagsConfiguration)
        {
            CreateContainer(dbConfig, tagsConfiguration);

            LogMigrationPerform(dbConfig);

            CreateDatabaseIfRequired(dbConfig);

            if (dbConfig.MigrationDirection == MigrationDirection.Down)
            {
                if (!dbConfig.MigrationVersion.HasValue)
                {
                    throw new ArgumentException("Migration down must have specified migration version");
                }

                m_runner.MigrateDown(dbConfig.MigrationVersion.Value);
            }
            else
            {
                if (!dbConfig.MigrationVersion.HasValue)
                {
                    m_runner.MigrateUp();
                }
                else
                {
                    m_runner.MigrateUp(dbConfig.MigrationVersion.Value);
                }
            }
        }
        private string[] GetTags(DatabaseConfiguration dbConfig, TagsConfiguration tagsConfiguration)
        {
            var tagList = new List <string>();

            if (!string.IsNullOrEmpty(dbConfig.DatabaseTag))
            {
                tagList.Add($"{TagsPrefixes.DatabasePrefix}{dbConfig.DatabaseTag}");
            }

            if (!string.IsNullOrEmpty(tagsConfiguration.EnvironmentTag))
            {
                tagList.Add($"{TagsPrefixes.EnvironmentPrefix}{tagsConfiguration.EnvironmentTag}");
            }

            if (!string.IsNullOrEmpty(tagsConfiguration.MigrationTypeTag))
            {
                tagList.Add($"{TagsPrefixes.MigrationTypePrefix}{tagsConfiguration.MigrationTypeTag}");
            }

            return(tagList.ToArray());
        }
        protected ServiceProvider CreateContainer(DatabaseConfiguration dbConfig, TagsConfiguration tagsConfiguration)
        {
            var pathsConfiguration          = m_config.GetSection("PathsConfiguration").Get <PathConfiguration>();
            var databaseCreateConfiguration = m_config.GetSection("DatabaseCreateConfiguration").Get <DatabaseCreateConfiguration>();

            var serviceCollection = new ServiceCollection();

            serviceCollection
            .AddNLog()
            .AddNHibernate(dbConfig)
            .AddSingleton(dbConfig)
            .AddSingleton(pathsConfiguration)
            .AddSingleton(databaseCreateConfiguration)
            .AddSingleton(typeof(DatabaseDropper))
            .AddFluentMigratorCore()
            .AddTransient <IScriptPathResolver, ScriptPathResolver>()
            .AddScoped <IMigrationRunner, ConstrainedMigrationRunner>()
            .AddScoped <IMigrationRunnerConventions, CustomMigrationRunnerConventions>()
            .AddScoped <TagValidatorBase, EnvironmentTagValidator>()
            .AddScoped <TagValidatorBase, DatabaseTagValidator>()
            .AddScoped <TagValidatorBase, MigrationTypeValidator>()
            .AddScoped <IVersionLoader>(sp =>
            {
                var options       = sp.GetRequiredService <IOptions <RunnerOptions> >();
                var connAccessor  = sp.GetRequiredService <IConnectionStringAccessor>();
                var hasConnection = !string.IsNullOrEmpty(connAccessor.ConnectionString);
                if (options.Value.NoConnection || !hasConnection)
                {
                    return(ActivatorUtilities.CreateInstance <ConnectionlessVersionLoader>(sp));
                }

                return(ActivatorUtilities.CreateInstance <ValidatingVersionLoader>(sp));
            })
            .AddLogging(lb => lb.AddDebug().AddFluentMigratorConsole())
            .ConfigureRunner(builder =>
                             builder
                             .AddSupportedDatabases(m_appConfiguration.SupportedDialects)
                             .WithGlobalConnectionString(dbConfig.ConnectionString)
                             .ScanIn(m_appConfiguration.MigrationAssemblies)
                             .For.All())
            .Configure <SelectingProcessorAccessorOptions>(opt => opt.ProcessorId = dbConfig.DatabaseDialect)
            .Configure <RunnerOptions>(opt =>
            {
                opt.Tags = GetTags(dbConfig, tagsConfiguration);
                opt.TransactionPerSession = dbConfig.TransactionPerSession;
            });

            var serviceProvider = serviceCollection.BuildServiceProvider();

            var loggerFactory = serviceProvider.GetRequiredService <ILoggerFactory>();

            loggerFactory.AddNLog(new NLogProviderOptions
            {
                CaptureMessageTemplates  = true,
                CaptureMessageProperties = true
            });
            NLog.LogManager.LoadConfiguration("NLog.config");

            m_databaseCreator = serviceProvider.GetRequiredService <DatabaseCreator>();
            m_runner          = serviceProvider.GetRequiredService <IMigrationRunner>();
            m_logger          = serviceProvider.GetRequiredService <ILogger <ApplicationRunnerBase> >();

            return(serviceProvider);
        }