在我的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()时,这种情况就会发生。
为什么会这样?
答案 0 :(得分:1)
此问题是由可能的循环级联删除引起的。这可以以多种形式发生,但它归结为一次被两个或多个级联删除规则删除的记录,因此我假设您有另一个涉及Job
实体的关系,以及何时删除来自Job
表的记录,可能此删除将结束尝试删除另一个表中同一记录的双方。
我建议你看看这个post,看看你是否有类似@KristofClaes&#39;中显示的例子的情况。答案。
您可以通过使用Fluent API禁用级联删除或将某些关系定义为可选(使用可为空的外键)来避免此类不明确的删除路径。