Entity Framework 代码优先中相同 table 的多个外键

Multiple Foreign Key for Same table in Entity Framework Code First

我的应用程序中有两个实体,我使用 Entity Framework Code First 填充了数据库。 Task实体中有两个Employee id;其中之一用于 RequirerEmploye,其他用于 RequestedEmployee。在包管理器控制台中创建更新数据库时,出现如下错误:

Introducing FOREIGN KEY constraint 'FK_dbo.Tasks_dbo.Employees_DemandingEmployeeID' on table 'Tasks' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

我的任务Class:

    public int ID { get; set; }
    public int DemandingEmployeeID { get; set; }
    public int RequestedEmployeeID { get; set; }



    [ForeignKey("DemandingEmployeeID")]
    [InverseProperty("DemandingTasks")]
    public virtual Employee DemandingEmployee { get; set; }

    [ForeignKey("RequestedEmployeeID")]
    [InverseProperty("RequestedTasks")]

    public virtual Employee RequestedEmployee { get; set; }

我的员工Class:

    public int ID { get; set; }

    public virtual ICollection<Task> DemandingTasks { get; set; }    
    public virtual ICollection<Task> RequestedTasks { get; set; }

我的背景:

   modelBuilder.Entity<Task>().HasRequired(m => m.DemandingEmployee).WithMany(m => m.DemandingTasks).HasForeignKey(m => m.DemandingEmployeeID);
        modelBuilder.Entity<Task>().HasRequired(m => m.UpdatedEmployee).WithMany(m => m.UpdatedTasks).HasForeignKey(m => m.UpdatedEmployeeID);

问题是您有多个级联删除路径,这可能会导致尝试删除数据库中的同一行。要了解有关此错误的更多信息,请查看 https://support.microsoft.com/en-us/kb/321843。按照以上步骤解决问题。

改变你的class:

public int ID { get; set; }
public int DemandingEmployeeID { get; set; }
public int RequestedEmployeeID { get; set; }

public virtual Employee DemandingEmployee { get; set; }
public virtual Employee RequestedEmployee { get; set; }

更改上下文:

modelBuilder.Entity<Task>()
     .HasRequired(m => m.DemandingEmployee)
     .WithMany(m => m.DemandingTasks)
     .HasForeignKey(m => m.DemandingEmployeeID)
     .WillCascadeOnDelete(false);

modelBuilder.Entity<Task>()
     .HasRequired(m => m.RequestedEmployee)
     .WithMany(m => m.RequestedTasks)
     .HasForeignKey(m => m.RequestedEmployeeId)
     .WillCascadeOnDelete(false);

modelBuilder.Entity<Task>()
    .HasRequired(m => m.UpdatedEmployee)
    .WithMany(m => m.UpdatedTasks)
    .HasForeignKey(m => m.UpdatedEmployeeID)
    .WillCascadeOnDelete(false);