EntityFramework迁移cascadeDelete参数

时间:2012-08-14 10:42:32

标签: entity-framework ef-code-first ef-migrations

我正在使用EF 4.3迁移功能来创建数据库迁移脚本。 当我运行Add-Migration命令时,生成的脚本创建如下:

        CreateTable(
            "dbo.Recipients",
            c => new
                {
                    RecipientID = c.String(nullable: false, maxLength: 128),
                    SurveyRoundID = c.String(nullable: false, maxLength: 128),
                    LastUpdatedAt = c.DateTime(),
                })
            .PrimaryKey(t => t.RecipientID)
            .ForeignKey("dbo.Employees", t => t.EmployeeID, cascadeDelete: true)
            .ForeignKey("dbo.SurveyRounds", t => t.SurveyRoundID, cascadeDelete: true)
            .Index(t => t.EmployeeID)
            .Index(t => t.SurveyRoundID);

我遇到的问题是scafolding迁移选择cascadeDelete为true,即使实体Recipient不是关系的主人。

现在我手动将cascadeDelete参数更改为false,但我想知道为什么默认选择true。

谢谢你, IDO。

2 个答案:

答案 0 :(得分:11)

感谢您的回答,它帮助了我,因为我注意到并且在尝试更新数据库时有时会出现错误,因为我的几个类有多个关系,导致级联删除不理想。

请参阅以下有关删除级联删除默认设置的信息:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}

这里面是Context类。

答案 1 :(得分:8)

它按预期工作。它不是关系中的主体实体,因此它定义了外键约束,并且该约束具有级联删除选项。将cascade delete设置为true(除非删除约定或在流畅映射中更改它,否则首先在EF代码中默认设置)表示如果删除Employee记录,则级联删除将触发删除Recipient(同样适用)在SurveyRounds)。

此模型对于级联删除实际上并不理想,因为实体依赖于多个关系。您应该在实体映射中直接删除级联删除。