プロジェクトでデータベースの移行を管理するために FluentMigrator (1.1.0) を使用しています。移行プロジェクトは ac# クラス ライブラリであり、流暢な移行ツールを使用してリビジョンを実行しています。私のローカル環境は Windows mysql インスタンスですが、開発環境は Linux mysql インスタンスです。
先日、開発環境に対してリビジョンを実行しているときに、移行に失敗しました。DB を調べたところ、リビジョンが実行される前の状態に DB がロールバックされていないことがわかりました。
以下は失敗したリビジョンです。テーブルが元の状態に戻されなかったのはなぜですか? 列 A、B、および C はすべて削除されたままです。
public override void Up()
{
Delete
.Column("A").Column("B").Column("C")
.FromTable("TABLENAME");
Delete.FromTable("TABLENAME").IsNull("D");
//FAILS HERE - !!! Cannot change column 'D': used in a foreign key constraint
//'FK_TABLENAME_D_OTHERTABLE_COLUMN'
Alter.Column("D").OnTable("TABLENAME").AsInt32().NotNullable();
Create
.PrimaryKey("PK_TABLENAME")
.OnTable("TABLENAME")
.Columns(new string[] { "D", "E", "F", "G" });
}
wikiによると、彼らは移行のサポートを追加し、デフォルトのトランザクション動作が移行ごとに 1 つのトランザクションであることを確認しました。また、この単純な移行がロールバックされないことも確認しました。
public override void Up()
{
Delete
.Column("A").Column("B").Column("C")
.FromTable("Table");
throw new Exception("e");
}
次に、このリビジョンを試したところ、正常にロールバックされました。
public override void Up()
{
Create.Table("Table")
.WithColumn("Id").AsInt32().PrimaryKey().Identity().NotNullable();
throw new Exception("e");
}
考え?
アップデート
テーブル作成のリビジョンは次のとおりです。
[Migration(49)]
public class _0049_CreateTableNameTable : Migration
{
public override void Up()
{
Create.Table("TableName")
.WithColumn("Id").AsInt32().PrimaryKey().Identity().NotNullable()
.WithColumn("FK1").AsInt32().ForeignKey("OtherTable", "Id").NotNullable()
.WithColumn("FK2").AsInt32().ForeignKey("OtherTable2", "Id").NotNullable()
.WithColumn("FK3").AsInt32().ForeignKey("OtherTable3", "Id").NotNullable()
.WithColumn("FK4").AsInt32().ForeignKey("OtherTable4", "Id").NotNullable()
.WithColumn("CreatedDate").AsDateTime().NotNullable()
.WithColumn("UpdatedDate").AsDateTime().NotNullable();
}
}
表の削除のリビジョンは次のとおりです。
[Migration(53)]
public class _0053_AlterTableNameTable : Migration
{
public override void Up()
{
Delete
.Column("Id").Column("UpdatedDate").Column("CreatedDate")
.FromTable("TableName");
Delete.FromTable("TableName").IsNull("FK1");
//FAILS HERE
Alter.Column("FK1").OnTable("TableName").AsInt32().NotNullable();
Create
.PrimaryKey("PK_TableName")
.OnTable("TableName")
.Columns(new string[] { "FK1", "FK2", "FK3", "FK4" });
}
}