尝试使用Asp Net Core创建简单的CRUD应用。我有2个实体:
部门和员工(一对多)。我需要从部门表中删除记录。但是,当我试图使用", "
或OnDelete(DeleteBehavior.Restrict)
删除记录时,我有例外:
表“部门”中的“更新”或“删除”违反了外键约束 “ FK_Employees_Departments_DepartmentCode”表“ Employees”
我该如何解决此问题? 实体员工:
OnDelete(DeleteBehavior.ClientSetNull)
实体部门:
public class Employee
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required(ErrorMessage = "Input fullname of employee")]
public string FullName { get; set; }
[Required(ErrorMessage = "Input date of birth")]
public DateTime DateOfBirth { get; set; }
[Required(ErrorMessage = "Input code")]
public string Code { get; set; }
[Required(ErrorMessage = "Input fullname of employee")]
public int Salary { get; set; }
public string DepartmentCode { get; set; }
public Department Department { get; set; }
}
上下文类设置:
public class Department
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required(ErrorMessage = "Input name of department")]
public string Name { get; set; }
[Required(ErrorMessage = "Input code of department")]
public string Code { get; set; }
public ICollection<Employee> Employees { get; set; }
public Department()
{
Employees = new List<Employee>();
}
}
答案 0 :(得分:0)
在EF中配置的删除行为只能在EF更改跟踪所跟踪的实体中应用。因此,您需要加载属于部门的所有员工才能按预期进行此工作。
但是,数据库外键定义还定义了on删除操作(级联,设置为null,不执行任何操作),因此,即使您在上下文中编写了一个设置为null的策略,DB仍然可以对on删除应用不同的策略。 EF核心默认为级联删除。
答案 1 :(得分:0)
在DeleteBehavior
枚举中的所有字段中,只有两个实际向数据库添加了级联的外键行为:Cascade
和SetNull
。所有其他选项都会创建外键,但不执行删除操作,但是EF对被跟踪实体的作用不同。
在您的情况下,它可能应该为SetNull
,因为我认为雇员可以不存在部门而存在。此设置将允许您删除Department
对象而无需加载其Employees
。数据库会将其DepartmentCode
设置为null
。