public override void ApplyDatabaseDelta(ElementCode context, IDatabaseDelta databaseDelta) { // 列の型など付与するデリゲート Action <IColumnDef> columnOption = (column) => { context.Concat(column.DbType.ToDbTypeString((column.Flags & ColumnFlags.Serial) != 0 ? DbTypeStringFlags.Serial : 0)); if ((column.Flags & ColumnFlags.Nullable) != 0) { context.Add(SqlKeyword.Null); } else { context.Add(SqlKeyword.NotNull); } if ((column.Flags & ColumnFlags.DefaultCurrentTimestamp) != 0) { context.Add(SqlKeyword.Default, SqlKeyword.CurrentTimestamp); } }; // 捨てるべきテーブルを捨てる foreach (var table in databaseDelta.TablesToDrop) { context.Add(SqlKeyword.DropTable, SqlKeyword.IfExists); context.Concat(table.Name); context.Go(); } // 新たに増えるテーブルを作成する foreach (var table in databaseDelta.TablesToAdd) { var tableName = table.Name; // テーブル本体 context.Add(SqlKeyword.CreateTable, SqlKeyword.IfNotExists); context.Concat(tableName); context.AddColumnDefs(table.ColumnDefs, null, columnOption); context.Go(); // プライマリキー Add(context, tableName, table.GetPrimaryKey()); // インデックス foreach (var index in table.GetIndices()) { Add(context, tableName, index); } // ユニークキー foreach (var unique in table.GetUniques()) { Add(context, tableName, unique); } } // 変化するテーブルに対応する foreach (var table in databaseDelta.TablesToModify) { var tableName = table.Name; // 先にプライマリキー等の制約を捨てる Drop(context, tableName, table.PrimaryKeyToDrop); foreach (var index in table.IndicesToDrop) { Drop(context, tableName, index); } foreach (var unique in table.UniquesToDrop) { Drop(context, tableName, unique); } // 列を捨てる foreach (var column in table.ColumnsToDrop) { Drop(context, tableName, column); } // 列を追加する foreach (var column in table.ColumnsToAdd) { Add(context, tableName, column, columnOption); } // プライマリキー追加 Add(context, tableName, table.PrimaryKeyToAdd); // インデックス追加 foreach (var index in table.IndicesToAdd) { Add(context, tableName, index); } // ユニークキー追加 foreach (var unique in table.UniquesToAdd) { Add(context, tableName, unique); } } }
/// <summary> /// データベースに変化分を適用する /// </summary> /// <param name="context">コマンド生成先のバッファ</param> /// <param name="databaseDelta">データベース変化分</param> public abstract void ApplyDatabaseDelta(ElementCode context, IDatabaseDelta databaseDelta);