在简单模型(MVC ASP.NET)中找不到周期异常的原因



我得到了一个模型,其中有Business、Workers和Jobs,还有Worker的特定Job中的业务的WorkerReports。

public class Business
{
    public int BusinessId { get; set; }
    public List<Job> jobs{ get; set; }
    public List<Worker> workers { get; set; }
}
public class Worker
{
    public int WorkerId{ get; set; }
    public string Name{ get; set; }
    public int BusinessId{ get; set; }
}
public class Inspector
{
    public int InspectorId { get; set; }
    public String Name{ get; set; }

}
public class Job
{
    public int JobId { get; set; }
    public string NameOfJob{ get; set; }
    public int BusinessId { get; set; }
}
public class WorkerReport
{
    public int WorkerReportId { get; set; }
    public int InspectorId { get; set; }
    public int JobId { get; set; }
    public int WorkerId { get; set; }
    public Job job{ get; set; }
    public Worker worker{ get; set; }
    public Inspector Inspector { get; set; }
}

但当模型生成时,我出现了以下错误:"WorkerReports"表上的"FK_dbo.WorkerReports_dbo.Workers_WorkerId"可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束

我不明白为什么会出现这个错误,因为我不知道循环是在哪里产生的。有人知道吗?圆圈是在哪里产生的?非常感谢,为一位出色的程序员提供帮助。

WorkerReport上有两个删除级联路径。

  • 业务->员工->员工报告
  • 业务->工作->工作报告

默认情况下,所有关系都是必需的,并且约定启用从OneToManyCascadeDeleteConvention的所有删除级联。解决方案是从WorkerJob手动移除级联中的至少一个。

modelBuilder.Entity<WorkerReport>()
    .HasRequired(x => x.job) // HasOptional for nullable FK
    .WithMany()
    .WillCascadeOnDelete(false);
// modelBuilder.Entity<WorkerReport>()
//    .HasRequired(x => x.worker) // HasOptional for nullable FK
//    .WithMany()
//    .WillCascadeOnDelete(false);

或者通过删除默认的删除级联约定来禁用所有删除级联。

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

把它放在DbContext类中。

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // here
    }
}

最新更新