实体框架迁移cascadeDelete参数

9

我正在使用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);

我遇到的问题是,即使实体Recipient不是关系的主控方,脚手架迁移也选择将cascadeDelete设为true。
目前我正在手动将cascadeDelete参数更改为false,但我想知道为什么默认情况下选择true。
谢谢, Ido.
2个回答

11

谢谢你的答案,它帮助了我。我注意到在尝试更新数据库时会出现错误,因为我的几个类有多个关系,使级联删除不是理想的选择。

请参见下文以删除级联删除的默认设置:

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

这个内容放在 Context 类里面。


正是我所寻找的! - Mixxiphoid
1
那对我来说很好用。这应该是选择加入而不是选择退出! - Michiel Cornille

9

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

这种模型对于级联删除确实不理想,因为实体在多个关系中是依赖的。 您应该直接在实体映射中删除级联删除。


你知道如何在迁移中使用Sql(..)定义ON DELETE SET NULL而不必诉诸DDL吗? - JoeBrockhaus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接