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);
我的应用程序中有两个实体,我使用 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);