Связь между таблицами EF

 public class User : IdentityUser<int>
 {
     public string FullName { get; set; }

     [Required]
     public int DepartmentId { get; set; }
     public Department Department { get; set; }

     [Required]
     public int PositionId { get; set; }
     public Position Position { get; set; }
 }


 public class Department
 {
     public int Id { get; set; }
     public string Name { get; set; }
     public string? UniqueNumber { get; set; }
 }

public class Position
{
    public int Id { get; set; }
    public string Title { get; set; }
}

Сейчас если удаляю Department к которому привязан пользователь, то он удаляется вместе с User или Position.

Как в этом случае поступить, запретить удалять должность или отдел если он привязан к пользователю или сделать связь много ко многим. Подскажите пожалуйста как лучше решить эту проблему.


Ответы (1 шт):

Автор решения: Faraday

Связь много-ко-многим тут не подойдёт для User-Position, т.к. она описывается ситуацию, когда один пользователь может занимать много должностей, а так же на одной должности может быть много пользователей.

Связь User-Department может быть реализована как много-ко-многим, если у вас первоначальная логика такая, что один юзер может работать во многих отделах. Если у вас один юзер может работать только в одном отделе, тут больше подойдёт связь один-ко-многим.

Для более детального изучения, рекомендую посмотреть эти статьи для правильной конфигурации связи один-ко-многим (а так же дополнительные):

UPD: Если вы хотите реализовать удаления Department таким образом, что бы не удалялся User, вам нужно указать, что вам юзер может "существовать" без Department изменив его внешний ключ на nullable тип, т.е., на int?. В результате у вас будет вот такой юзер:

public class User : IdentityUser<int>
{
    public string FullName { get; set; }

    [Required]
    public int? DepartmentId { get; set; }
    public Department Department { get; set; }

    [Required]
    public int PositionId { get; set; }
    public Position Position { get; set; }
}

Такой пример отлично описан в этом разделе документации Microsoft.

→ Ссылка