ASP网络-使用OnDelete()从数据库中删除记录

时间:2019-11-02 15:37:06

标签: postgresql asp.net-core entity-framework-core

尝试使用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>();
        }
    }

2 个答案:

答案 0 :(得分:0)

在EF中配置的删除行为只能在EF更改跟踪所跟踪的实体中应用。因此,您需要加载属于部门的所有员工才能按预期进行此工作。

但是,数据库外键定义还定义了on删除操作(级联,设置为null,不执行任何操作),因此,即使您在上下文中编写了一个设置为null的策略,DB仍然可以对on删除应用不同的策略。 EF核心默认为级联删除。

答案 1 :(得分:0)

DeleteBehavior枚举中的所有字段中,只有两个实际向数据库添加了级联的外键行为:CascadeSetNull。所有其他选项都会创建外键,但不执行删除操作,但是EF对被跟踪实体的作用不同。

在您的情况下,它可能应该为SetNull,因为我认为雇员可以不存在部门而存在。此设置将允许您删除Department对象而无需加载其Employees。数据库会将其DepartmentCode设置为null