Asp net - удалить запись из БД с помощью OnDelete () - PullRequest
0 голосов
/ 02 ноября 2019

Попытка создать простое приложение CRUD, используя Asp Net Core. У меня есть 2 объекта: отдел и сотрудник (один ко многим). Мне нужно удалить запись из таблицы отдела. Но когда я пытаюсь удалить запись, используя OnDelete(DeleteBehavior.Restrict) или OnDelete(DeleteBehavior.ClientSetNull), у меня возникает исключение:

ОБНОВЛЕНИЕ или УДАЛЕНИЕ в таблице «Отделы» нарушает ограничение внешнего ключа «FK_Employees_Departments_DepartmentCode», таблица «Сотрудники»

Как я могу решить эту проблему? Сотрудник организации:

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>();
        }
    }

Настройки класса контекста:

protected override void OnModelCreating(ModelBuilder modelBuilder)

{
        modelBuilder.Entity<Department>()
            .HasMany<Employee>(d => d.Employees)
            .WithOne(e => e.Department)
            .HasForeignKey(e => e.DepartmentCode)
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<Department>()
            .HasKey(d => d.Code);

        modelBuilder.Entity<Employee>()
            .HasKey(e => e.Code);

        modelBuilder.Entity<Department>()
            .HasIndex(d => d.Name).IsUnique();
    }

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Из всех полей в перечислении DeleteBehavior только два фактически добавляют каскадное поведение внешнего ключа в базу данных: Cascade и SetNull. Все остальные параметры создают внешние ключи без каких-либо действий при удалении, но отличаются тем, что EF будет делать с отслеживаемыми объектами.

В вашем случае это, вероятно, должно быть SetNull, поскольку я предполагаю, что сотрудники могут существовать без отдела. Этот параметр позволит вам удалить объект Department, не загружая его Employees. База данных установит их DepartmentCode в null.

0 голосов
/ 02 ноября 2019

Режим удаления, настроенный в EF, может применяться только к тем объектам, которые отслеживаются с помощью отслеживания изменений EF. Таким образом, вам нужно будет загрузить всех сотрудников, принадлежащих отделу, чтобы выполнить эту работу, как ожидалось.

НО Определение внешнего ключа базы данных также определяет действие при удалении (каскадирование, установка нуля, ничего не делать). Так что даже еслиВы кодируете в своем контексте заданную нулевую стратегию, БД все еще может применять другую стратегию для удаления. По умолчанию ядро ​​EF является каскадным удалением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...