public MigrationGenerator(NHibernate.Cfg.Configuration configuration, Encoding encoding) { this.Encoding = encoding; Configuration = configuration; Configuration.BuildMappings(); // necessary to complete columns creation (foreign keys...) var mapping = Configuration.CreateMappings(new GenericDialect()); // extract the tables scheme CurrentScheme = new MigrationScheme(mapping.IterateTables.Select(t => new MigrationTable(t))); UpdateForeignKeys(); PreviousSnapshotFileName = string.Format("{0}\\previous.snapshot",Directory.GetCurrentDirectory()); }
public IEnumerable<Migration> CompareScheme(MigrationScheme previous, MigrationScheme current) { // detect new tables foreach (var table in current.Tables) { if (!previous.HasTable(table.Name)) { yield return new CreateTableMigration(table); } else // table still exists { var previous_table = previous[table.Name]; foreach (var column in table.Columns) { var previous_column = previous_table.Columns.FirstOrDefault(c => c.Name == column.Name); if (previous_column == null) //detect new columns { yield return new CreateColumnMigration(column); } else { // column alteration if (!previous_column.IsSimilarTo(column)) yield return new AlterColumnMigration(previous_column, column); } } // delect deleted columns foreach (var previous_column in previous_table.Columns) { var column = table.Columns.FirstOrDefault(c => c.Name == previous_column.Name); if (column == null) { // column was deleted yield return new DeleteColumnMigration(previous_column); } } } } // detect droped tables foreach (var table in previous.Tables) { if (!current.HasTable(table.Name)) { yield return new DropTableMigration(table); } } }