public void Rollback(int steps, bool useAutomaticTransactionManagement) { var availableMigrations = MigrationLoader.LoadMigrations(); var migrationsToRollback = new List <IMigrationInfo>(); foreach (long version in VersionLoader.VersionInfo.AppliedMigrations()) { IMigrationInfo migrationInfo; if (availableMigrations.TryGetValue(version, out migrationInfo)) { migrationsToRollback.Add(migrationInfo); } } using (IMigrationScope scope = _migrationScopeHandler.CreateOrWrapMigrationScope(useAutomaticTransactionManagement && TransactionPerSession)) { foreach (IMigrationInfo migrationInfo in migrationsToRollback.Take(steps)) { ApplyMigrationDown(migrationInfo, useAutomaticTransactionManagement && migrationInfo.TransactionBehavior == TransactionBehavior.Default); } scope.Complete(); } VersionLoader.LoadVersionInfo(); if (!VersionLoader.VersionInfo.AppliedMigrations().Any()) { VersionLoader.RemoveVersionTable(); } }
public void Rollback(int steps, bool useAutomaticTransactionManagement) { try { var migrations = VersionLoader.VersionInfo.AppliedMigrations().Intersect(MigrationLoader.Migrations.Keys); foreach (var migrationNumber in migrations.Take(steps)) { ApplyMigrationDown(migrationNumber); } VersionLoader.LoadVersionInfo(); if (!VersionLoader.VersionInfo.AppliedMigrations().Any()) { VersionLoader.RemoveVersionTable(); } if (useAutomaticTransactionManagement) { Processor.CommitTransaction(); } } catch (Exception) { if (useAutomaticTransactionManagement) { Processor.RollbackTransaction(); } throw; } }