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 为真。

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

谢谢你,伊多。

4

2 回答 2

11

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

请参阅下面的删除级联删除默认设置:

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

这进入 Context 类。

于 2013-09-20T15:14:12.847 回答
9

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

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

于 2012-08-14T12:03:50.663 回答