private IEnumerable <Func <IReadOnlyList <MigrationCommand> > > GetMigrationCommandLists( IReadOnlyList <HistoryRow> appliedMigrationEntries, string targetMigration = null) { IReadOnlyList <Migration> migrationsToApply, migrationsToRevert; PopulateMigrations( appliedMigrationEntries.Select(t => t.MigrationId), targetMigration, out migrationsToApply, out migrationsToRevert); for (var i = 0; i < migrationsToRevert.Count; i++) { var migration = migrationsToRevert[i]; var index = i; yield return(() => { _logger.LogInformation( RelationalEventId.RevertingMigration, () => RelationalStrings.RevertingMigration(migration.GetId())); return GenerateDownSql( migration, index != migrationsToRevert.Count - 1 ? migrationsToRevert[index + 1] : null); }); } foreach (var migration in migrationsToApply) { yield return(() => { _logger.LogInformation( RelationalEventId.ApplyingMigration, () => RelationalStrings.ApplyingMigration(migration.GetId())); return GenerateUpSql(migration); }); } }
private IEnumerable <Func <IReadOnlyList <IRelationalCommand> > > GetMigrationCommands( IReadOnlyList <HistoryRow> appliedMigrationEntries, string targetMigration = null) { var appliedMigrations = new Dictionary <string, TypeInfo>(); var unappliedMigrations = new Dictionary <string, TypeInfo>(); foreach (var migration in _migrationsAssembly.Migrations) { if (appliedMigrationEntries.Any( e => string.Equals(e.MigrationId, migration.Key, StringComparison.OrdinalIgnoreCase))) { appliedMigrations.Add(migration.Key, migration.Value); } else { unappliedMigrations.Add(migration.Key, migration.Value); } } IReadOnlyList <Migration> migrationsToApply; IReadOnlyList <Migration> migrationsToRevert; if (string.IsNullOrEmpty(targetMigration)) { migrationsToApply = unappliedMigrations .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider)) .ToList(); migrationsToRevert = new Migration[0]; } else if (targetMigration == Migration.InitialDatabase) { migrationsToApply = new Migration[0]; migrationsToRevert = appliedMigrations .OrderByDescending(m => m.Key) .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider)) .ToList(); } else { targetMigration = _migrationsAssembly.GetMigrationId(targetMigration); migrationsToApply = unappliedMigrations .Where(m => string.Compare(m.Key, targetMigration, StringComparison.OrdinalIgnoreCase) <= 0) .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider)) .ToList(); migrationsToRevert = appliedMigrations .Where(m => string.Compare(m.Key, targetMigration, StringComparison.OrdinalIgnoreCase) > 0) .OrderByDescending(m => m.Key) .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider)) .ToList(); } for (var i = 0; i < migrationsToRevert.Count; i++) { var migration = migrationsToRevert[i]; yield return(() => { _logger.LogInformation(RelationalStrings.RevertingMigration(migration.GetId())); return GenerateDownSql( migration, i != migrationsToRevert.Count - 1 ? migrationsToRevert[i + 1] : null); }); } foreach (var migration in migrationsToApply) { yield return(() => { _logger.LogInformation(RelationalStrings.ApplyingMigration(migration.GetId())); return GenerateUpSql(migration); }); } }