可以在迁移中添加级联删除规则吗?

时间:2011-10-17 00:54:08

标签: fluent-migrator

在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中删除了某些内容,那么任何相关记录也会被删除吗?

2 个答案:

答案 0 :(得分:13)

您可以在同一个迁移中创建一个单独的外键,并可以选择设置级联规则:

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

希望这有帮助。

答案 1 :(得分: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)
    );
}

有更好的方法吗?