Как правильно заполнить данные с циклической зависимостью в Entity Framework Core? - PullRequest
1 голос
/ 26 мая 2020

Прежде всего, я использую Entity Framework Core (в NET Core 3.1) с подходом «сначала код».

Представьте, что у меня есть пара таких сущностей:

public class Employee
{
    [Key]
    [Required]
    public int Id { get; set; }

    [Required]
    [ForeignKey(nameof(Department))]
    public int DepartmentId { get; set; }

    public virtual Department Department { get; set; }
}

public class Department
{
    [Key]
    [Required]
    public int Id { get; set; }

    [Required]
    [ForeignKey(nameof(Manager))]
    public int ManagerId { get; set; }

    public virtual Employee Manager { get; set; }
}

С семантикой, что каждый Employee принадлежит Department, а каждый Department имеет Employee в качестве менеджера.

Я хотел бы заполнить базу данных некоторыми значениями, скажем «Генеральный директор» компании, которая будет принадлежать «Дирекции» отделу, менеджером которого он должен быть; однако, когда я пытаюсь выполнить это, я сталкиваюсь с ошибкой.

Могу ли я что-нибудь сделать, чтобы вставить одновременно Employee и Department при заполнении базы данных с помощью экземпляр ModelBuilder? Я знаю, что есть способ отключить ограничения внешнего ключа, но поскольку это сначала код, я не уверен, как это сделать.

Заранее спасибо.

1 Ответ

2 голосов
/ 26 мая 2020

Это в основном не связано с добавлением данных в раздачу или нет. SaveChanges вызовет исключение, если не сможет применить запрошенные изменения в последовательности операторов INSERT, UPDATE и DELETE. Здесь, если вы добавляете новый отдел и менеджера, где менеджер находится в отделе и является его менеджером, ни одна из сущностей не может быть ВСТАВЛЕНА.

Обычно вы просто делаете необязательным наличие менеджера для отдела. В конце концов, что будет, если уйдет руководитель отдела? Логично, что в Департаменте может не быть менеджера какое-то время, даже после его создания. Итак, добавьте новый отдел, SaveChanges (), добавьте нового менеджера в отдел, SaveChanges ().

...