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;
            }
        }