我有两张桌子员工和学位。在这两个表之间存在一对多的关系。 (员工可以有多个学位)当我删除员工时,我也要删除该员工的所有学位。我在其他帖子中发现我可以使用级联删除。试图添加级联删除,但我尝试删除员工时收到错误。我尝试了以下方法:
我的两张桌子:
public partial class Degree
{
public int DegreeId { get; set; }
public string Course { get; set; }
public string Level { get; set; }
public string School { get; set; }
public int Employee_BSN { get; set; }
public virtual Employee Employee { get; set; }
}
public partial class Employee
{
public Employee()
{
this.Degrees = new HashSet<Degree>();
}
public int BSN { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public virtual ICollection<Degree> Degrees { get; set; }
}
阅读几篇文章后,我发现了这一点。但这并没有解决我的问题。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Degree>()
.HasRequired(t=>t.Employee)
.WithMany(t=>t.Degrees)
.HasForeignKey(d=>d.Employee_BSN)
.WillCascadeOnDelete(true);
base.OnModelCreating(modelBuilder);
}
在我的员工控制器中,我有以下删除方法
// GET: Employees/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Employee employee = db.Employees.Find(id);
if (employee == null)
{
return HttpNotFound();
}
return View(employee);
}
// POST: Employees/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Employee employee = db.Employees.Find(id);
db.Employees.Remove(employee);
db.SaveChanges();
return RedirectToAction("Index");
}
错误
DELETE语句与REFERENCE约束“FK_Degree_Employee”冲突。冲突发生在数据库“\ APP_DATA \ DATABASE.MDF”,表“dbo.Degree”,列“Employee_BSN”中。 声明已经终止。
答案 0 :(得分:1)
格特是对的,很可能你还没有配置级联删除。
问题在于,当您删除员工时,Entity Framework会尝试将所有关联度数的员工外键设置为null。 这可能是您的数据库设计所允许的 - 员工外键不能为空。
因此,您必须为学位表中的员工FK启用级联删除。
关于如何做到这一点,这是一个很好的答案:https://stackoverflow.com/a/35886878/4227836