Inheritance: IMigrationStepMetadata
 public IEnumerable<MigrationStep> Aggregate()
 {
     Dictionary<string, Aggregation> aggregations = FindLargestApplicableAggregations();
     foreach (ApplicableMigration applicableMigration in _applicableMigrations)
     {
         MigrationStepMetadata migrationStepMetadata;
         Aggregation aggregation;
         if (aggregations.TryGetValue(applicableMigration.Migration.Metadata.ModuleName, out aggregation))
         {
             // Note: we issue an aggregated migration step when the last migration is hit to adhere more or less
             // to the ordering of the migrations.
             if (applicableMigration.Migration.Metadata.Timestamp == aggregation.LastAggregatedMigration.Timestamp)
             {
                 // aggregate migration step
                 migrationStepMetadata = new MigrationStepMetadata(MigrationDirection.Up, false, aggregation.AggregatedMigrations);
                 Log.Info("Using {0} to aggregate {1} migration(s) from module '{2}'", aggregation.Migration.Implementation.GetName(), migrationStepMetadata.Migrations.Count(), migrationStepMetadata.ModuleName);
                 yield return new MigrationStep(aggregation.Migration.Implementation, migrationStepMetadata);
             }
             if (applicableMigration.Migration.Metadata.Timestamp <= aggregation.Migration.Metadata.Timestamp)
             {
                 continue; // the migration will be included in the aggregate
             }
         }
         // single migration step
         migrationStepMetadata = new MigrationStepMetadata(applicableMigration.Direction, applicableMigration.Migration.UseModuleNameAsDefaultSchema, new[] { MetadataFor(applicableMigration) });
         yield return new MigrationStep(applicableMigration.Migration.Implementation, migrationStepMetadata);
     }
 }
Beispiel #2
0
        /// <summary>
        /// Alters the database schema by applying the specified migration. Versioning is unaffected by this operation and any timestamp information on the <paramref name="migration"/> is disregarded.
        /// </summary>
        public void Alter(IMigration migration)
        {
            if (migration is IReversibleMigration)
            {
                Log.Info(LogCategory.General, "Migrations used to modify the database schema directly cannot be reversed.");
            }

            var migrationMetadata = new MigrationMetadata(0, "Bypass", "This migration is being executed without affecting the versioning.");
            var stepMetadata = new MigrationStepMetadata(MigrationDirection.Up, false, new[] { migrationMetadata });
            var batch = new MigrationBatch(new[]
            {
                new MigrationStep(migration, stepMetadata)
            }, Enumerable.Empty<IMigrationMetadata>(), new NoVersioning(), Configuration);
            batch.Execute();
        }