public override void WriteRollback(DdlRules rules, TextWriter writer) { if (Actual == null) { Expected.WriteDropStatement(rules, writer); return; } foreach (var foreignKey in ForeignKeys.Missing) { foreignKey.WriteDropStatement(Expected, writer); } foreach (var change in ForeignKeys.Different) { change.Expected.WriteDropStatement(Expected, writer); } // Extra columns foreach (var column in Columns.Extras) { writer.WriteLine(column.AddColumnSql(Expected)); } // Different columns foreach (var change1 in Columns.Different) { writer.WriteLine(change1.Actual.AlterColumnTypeSql(Actual, change1.Expected)); } foreach (var change in ForeignKeys.Different) { change.Actual.WriteAddStatement(Expected, writer); } rollbackIndexes(writer); // Missing columns foreach (var column in Columns.Missing) { writer.WriteLine(column.DropColumnSql(Expected)); } foreach (var foreignKey in ForeignKeys.Extras) { foreignKey.WriteAddStatement(Expected, writer); } switch (PrimaryKeyDifference) { case SchemaPatchDifference.Invalid: case SchemaPatchDifference.Update: writer.WriteLine($"alter table {Expected.Identifier} drop constraint if exists {Expected.PrimaryKeyName};"); writer.WriteLine($"alter table {Expected.Identifier} add {Actual.PrimaryKeyDeclaration()};"); break; case SchemaPatchDifference.Create: writer.WriteLine($"alter table {Expected.Identifier} drop constraint if exists {Expected.PrimaryKeyName};"); break; } }