public void Migrate_NoDiagnosticsAndThrows_Rollsback() { _steps[string.Empty][0].DatabaseMigration = _migration1; _steps[string.Empty][1].DatabaseMigration = _migration2; using (_mocks.Record()) { Expect.Call(_transactionProvider.Begin()).Return(_transaction); _migration1.Up(); _schemaStateManager.SetMigrationVersionApplied(1, null); _transaction.Commit(); Expect.Call(_transactionProvider.Begin()).Return(_transaction); _migration2.Up(); LastCall.Throw(new ArgumentException()); _transaction.Rollback(); } bool caught = false; try { _target.Migrate(_steps); } catch (ArgumentException) { caught = true; } Assert.IsTrue(caught); _mocks.VerifyAll(); }
public void Migrate(IDictionary <string, List <MigrationStep> > steps) { foreach (MigrationStep step in steps.SelectMany(row => row.Value).OrderBy(row => row.Version)) { _log.Info(step); using (Machine.Core.LoggingUtilities.Log4NetNdc.Push("{0}", step.MigrationReference.Name)) { _configuration.ActiveConfigurationKey = step.MigrationReference.ConfigurationKey; if (!_configuration.ShowDiagnostics) { IDbTransaction transaction = null; try { transaction = _transactionProvider.Begin(); step.Apply(); if (step.Reverting) { _schemaStateManager.SetMigrationVersionUnapplied(step.Version, _configuration.Scope); } else { _schemaStateManager.SetMigrationVersionApplied(step.Version, _configuration.Scope); } _log.InfoFormat("Comitting"); transaction.Commit(); } catch (Exception) { if (transaction != null) { _log.InfoFormat("Rollback"); transaction.Rollback(); } throw; } finally { _configuration.ActiveConfigurationKey = null; } } } } }