与级联删除(实体框架)的必需关系

时间:2015-02-14 20:18:25

标签: database entity-framework ef-code-first entity-framework-6

在我的db模型中,我得到了一个Jobs表和一个JobResults表。

模型定义如下所示:

public class Job
{
    public int Id { get; set; }
    public virtual JobResult Result { get; set; }
}

public class JobResult
{
    public int JobId { get; set; }
    public virtual Job Job { get; set; }
}

配置关系的流畅API如下:

   modelBuilder.Entity<Job>()
            .HasRequired(x => x.Result)
            .WithRequiredPrincipal(x => x.Job)
            .WillCascadeOnDelete(true);

   modelBuilder.Entity<JobResult>()
            .HasKey(x => x.JobId);

如您所见,这是一种必需的关系,它们都将作业的Id作为主键共享。 当一个Job被删除时,我显然也希望删除JobResult(这就是为什么我添加了WillCascadeOnDelete())。

但是当我使用上面的定义更新我的数据库时,我收到以下错误:

  

介绍FOREIGN KEY约束'FK_dbo.JobResults_dbo.Jobs_JobId'   在表'JobResults'上可能会导致循环或多个级联路径。   指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他   FOREIGN KEY约束。无法创建约束。见前   错误。

当我包含WillCascadeOnDelete()时,这种情况就会发生。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

此问题是由可能的循环级联删除引起的。这可以以多种形式发生,但它归结为一次被两个或多个级联删除规则删除的记录,因此我假设您有另一个涉及Job实体的关系,以及何时删除来自Job表的记录,可能此删除将结束尝试删除另一个表中同一记录的双方。

我建议你看看这个post,看看你是否有类似@KristofClaes&#39;中显示的例子的情况。答案。

您可以通过使用Fluent API禁用级联删除或将某些关系定义为可选(使用可为空的外键)来避免此类不明确的删除路径。