/// <inheritdoc /> public async Task MigrateAsync(CancellationToken token = default) { try { if (_migrationMap.Count == 0) { _logger?.LogWarning("No migrations were added to migrator. Skip migration"); return; } // check if database exists and create if not _logger?.LogInformation($"Check Database \"{_dbProvider.DbName}\" existence..."); var isDatabaseExist = await _dbProvider.CheckIfDatabaseExistsAsync(_dbProvider.DbName, token); if (isDatabaseExist) { _logger?.LogInformation($"Database \"{_dbProvider.DbName}\" exists. Starting migration..."); } else { _logger?.LogInformation($"Database \"{_dbProvider.DbName}\" doesn't exist. Creating database..."); await _dbProvider.CreateDatabaseIfNotExistsAsync(token); _logger?.LogInformation("Creating database completed."); } await _dbProvider.OpenConnectionAsync(token); // check if applied migrations table exists and create if not _logger?.LogInformation($"Check \"{_dbProvider.AppliedMigrationsTableName}\" table existence..."); var isMigrationTableExists = await _dbProvider.CheckIfTableExistsAsync(_dbProvider.AppliedMigrationsTableName, token); if (isMigrationTableExists) { _logger?.LogInformation($"Table \"{_dbProvider.AppliedMigrationsTableName}\" exists. "); } else { _logger?.LogInformation($"Creating \"{_dbProvider.AppliedMigrationsTableName}\" table..."); await _dbProvider.CreateAppliedMigrationsTableIfNotExistsAsync(token); _logger?.LogInformation($"Creating \"{_dbProvider.AppliedMigrationsTableName}\" table completed."); } // get applied migrations versions var(isUpgrade, migrationsToApply) = await GetMigrationsAsync(false, token); if (migrationsToApply.Count == 0) { _logger?.LogInformation($"Database \"{_dbProvider.DbName}\" is actual. Skip migration."); return; } _logger?.LogInformation($"Executing pre-migration scripts for database \"{_dbProvider.DbName}\"..."); var wasPreMigrationExecuted = await ExecutePreMigrationScriptsAsync(token); if (wasPreMigrationExecuted) { _logger?.LogInformation($"Executing pre-migration scripts for database \"{_dbProvider.DbName}\" completed."); // applied migration versions might be changed after pre-migration (isUpgrade, migrationsToApply) = await GetMigrationsAsync(true, token); } else { _logger?.LogInformation("No pre-migration scripts were found."); } if (migrationsToApply.Count == 0) { _logger?.LogInformation($"Database \"{_dbProvider.DbName}\" is actual. Skip migration."); return; } _logger?.LogInformation($"Migrating database \"{_dbProvider.DbName}\"..."); var policy = isUpgrade ? _upgradePolicy : _downgradePolicy; await MigrateAsync(migrationsToApply, isUpgrade, policy, token); await _dbProvider.CloseConnectionAsync(); _logger?.LogInformation($"Migrating database {_dbProvider.DbName} completed."); } catch (MigrationException) { throw; } catch (Exception e) { throw new MigrationException( MigrationError.MigratingError, $"Error while migrating database {_dbProvider.DbName}. Reason: {e.Message}", e); } }
/// <inheritdoc /> public async Task MigrateAsync() { try { await _dbProvider.CreateDatabaseIfNotExistsAsync(); await _dbProvider.OpenConnectionAsync(); var dbVersion = await GetCurrentDbVersion(); var targetVersion = _targetVersion ?? _migrations.Max(x => x.Version); if (targetVersion == dbVersion) { _logger?.LogInformation($"Database {_dbProvider.DbName} is actual. Skip migration."); return; } if (_migrations.All(x => x.Version != targetVersion)) { throw new MigrationException(MigrationError.MigrationNotFound, $"Migration {targetVersion} not found"); } _logger?.LogInformation($"Executing pre migration scripts for {_dbProvider.DbName}..."); await ExecutePreMigrationScriptsAsync(); _logger?.LogInformation($"Executing pre migration scripts for{_dbProvider.DbName} completed."); await _dbProvider.CreateHistoryTableIfNotExistsAsync(); // DB version might change after pre-migration dbVersion = await GetCurrentDbVersion(); _logger?.LogInformation($"Migrating database {_dbProvider.DbName}..."); if (targetVersion > dbVersion) { _logger?.LogInformation( $"Upgrading database {_dbProvider.DbName} from {dbVersion} to {targetVersion}..."); await UpgradeAsync(dbVersion, targetVersion); _logger?.LogInformation($"Upgrading database {_dbProvider.DbName} completed."); } else { _logger?.LogInformation( $"Downgrading database {_dbProvider.DbName} from {dbVersion} to {targetVersion}..."); await DowngradeAsync(dbVersion, targetVersion); _logger?.LogInformation($"Downgrading database {_dbProvider.DbName} completed."); } await _dbProvider.CloseConnectionAsync(); _logger?.LogInformation($"Migrating database {_dbProvider.DbName} completed."); } catch (Exception e) { _logger?.LogError(e, $"Error while migrating database {_dbProvider.DbName}"); throw; } }