/// <summary> /// Applies the specified <paramref name="migration"/> within the /// specified <paramref name="context"/>. /// </summary> /// <param name="migration">The migration to apply.</param> /// <param name="direction">The migration direction.</param> /// <param name="context">The context.</param> protected virtual void ApplyMigration(IMigration migration, MigrationDirection direction, MigrationContext context) { // // Notify environment // var beforeArgs = new BeforeMigrationEventArgs(migration.GetVersion(), migration, direction); OnBeforeMigration(beforeArgs); if (beforeArgs.Cancel) { throw new Exception("environment cancelled migration"); } // // Generate model // Database model = new Database(context); // // Send SQL statements on flush notification // model.FlushChanges += delegate(object sender, EventArgs e) { foreach (string sql in context.SqlProvider.GenerateSqlCommands(model)) { // Notify environment var beforeSqlArgs = new BeforeSqlEventArgs(sql); OnBeforeSql(beforeSqlArgs); if (beforeSqlArgs.Cancel) { throw new Exception("environment cancelled migration"); } // Execute SqlProcessor.ProcessMigrationStatement(context, sql); // Notify environment var afterSqlArgs = new AfterSqlEventArgs(sql, true); OnAfterSql(afterSqlArgs); } }; // // Run migration // if (direction == MigrationDirection.Up) { migration.Up(model); } else { migration.Down(model); } // // Flush changes // model.Flush(); // // Memorize migration // HistoryRepository.AddItem(context, new MigrationHistoryItem() { Date = DateTime.Now, Direction = direction, Version = migration.GetVersion() } ); // // Notify enviroment // var afterArgs = new AfterMigrationEventArgs(migration.GetVersion(), migration, direction, true); OnAfterMigration(afterArgs); }