9

FluentMigratorの移行で、関係を定義している場合は、次のように言います。

Create.Table("RelatedTable")
    .WithColumn("RelatedTableId").AsGuid().PrimaryKey()
    .WithColumn("MainTableId").AsGuid().NotNullable();
    .WithColumn("SomeInfo").AsString().NotNullable();

Create.Table("MainTable")
    .WithColumn("MainTableId").AsGuid().PrimaryKey()
        .ReferencedBy("FK_RelatedTable_RelatedTableId", "RelatedTable", "MainTableId")
    .WithColumn("AField").AsInt64().NotNullable()
    .WithColumn("AnotherField").AsString().NotNullable();

それらの間のカスケード削除タイプの関係を定義する方法はありますか?たとえば、MainTableから何かを削除すると、関連するレコードも削除されますか?

4

2 に答える 2

15

カスケードルールを設定するオプションを使用して、このように同じ移行で個別の外部キーを作成できます。

Create.ForeignKey("FK_RelatedTable_RelatedTableId")
               .FromTable("RelatedTable").ForeignColumn("RelatedTableId")
               .ToTable("MainTable").PrimaryColumn("MainTableId")
               .OnDeleteOrUpdate(System.Data.Rule.Cascade);

お役に立てれば。

于 2012-01-20T12:18:26.390 に答える
1

私がすぐにできる最善の方法は、SQL を実行して関係を自分で作成することです。これがこのプロジェクトに必要な唯一のオプションであるため、これを行い、カスケード削除を追加する拡張メソッドを作成しました。

public static void AddCascadeDeleteRelationship(
    this Migration db,
    String primaryTable,
    String primaryField,
    String foreignTable,
    String foreignField,
    String relationshipName)
{
    db.Execute.Sql(
        String.Format(
            "ALTER TABLE [{0}] ADD CONSTRAINT {1} FOREIGN KEY ( [{2}] ) " +
                "REFERENCES [{3}] ( [{4}] ) ON DELETE CASCADE;",
            foreignTable, relationshipName, foreignField, primaryTable, primaryField)
    );
}

より良い方法はありますか?

于 2011-10-17T12:55:44.840 に答える