2012-08-14 46 views
9

我正在使用EF 4.3迁移功能来创建数据库迁移脚本。 当我运行Add-转移命令生成的脚本创建为这样:EntityFramework迁移cascadeDelete参数

 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是真实的,即使实体收件人不属于关系的高手。

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

谢谢, 伊多。

回答

8

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

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

+0

您是否知道如何在迁移中不使用含有'Sql(..)'的DDL定义'ON DELETE SET NULL'? – JoeBrockhaus 2015-07-22 22:51:03

11

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

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

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

这里面去Context类。

+0

正是我在找的东西! – Mixxiphoid 2015-07-11 09:24:58

+1

这对我来说很好。这真的应该选择加入而不是退出! – 2015-08-20 07:04:20

相关问题