Как управлять отношениями «многие ко многим» с Entity Framework - PullRequest
0 голосов
/ 15 ноября 2018

Я создаю приложение MVC с использованием Entity Framework и использую соглашения Code First. Есть определенные отношения, в которых я не уверен.

Image to show relationship

Я добавил роли персонала, чтобы разбить отношения между сотрудниками и модулями. Модуль всегда должен иметь руководителя модуля и несколько преподавателей. В настоящее время мои сущности выглядят так:

public class Staff
{
    public int StaffId { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    public string EmailAddress { get; set; }

    public int? PhoneNumber { get; set; }

    public string Full
    {
        get
        {
            return LastName + ", " + FirstName;
        }
    }

    public virtual List<StaffRole> Roles { get; set; }

}

   public enum StaffModuleRoles
{
    Leader,
    Tutor
}


public class StaffRole
{
    [Key, ForeignKey("Staff"), Column(Order = 0)]
    public int StaffId { get; set; }

    [Key, ForeignKey("Module"), Column(Order = 1)]
    public string ModuleCode { get; set; }

    public StaffModuleRoles Role { get; set; }

    public Staff Staff { get; set; }

    public Module Module { get; set; }
}

 public class Module
{

    [Key]
    public string ModuleCode { get; set; }

    [MaxLength(50)]
    [Required]
    public string Title { get; set; }

    public string Description { get; set; }

    public List<Enrolment> Enrolments { get; set; }

    public Staff ModuleLeader { get; set; }

    public virtual List<Staff> Tutors { get; set; }

}

Какая лучшая практика здесь? Как видите, я в основном использую аннотации данных, и я довольно плохо знаком с EF и кодированием в целом.

Буду признателен за любую помощь, также спасибо за подсказки по заполнению сущностей.

Редактировать в ответ на комментарии

Мне интересно узнать, правильный ли дизайн моей базы данных, и если да, то как мне создать это с помощью Entity Framework.

1 Ответ

0 голосов
/ 27 ноября 2018

Что касается вашего дизайна, вы можете переосмыслить структуру этих таблиц. Вот почему я так говорю. Предоставляя вашему объекту модуля свойство ModuleLeader, вы фактически говорите: «Модуль может иметь только 1 сотрудника», но затем вы помещаете отношение M: M в сочетание с StaffModule, которое говорит: «В модуле может быть много сотрудников». Я понимаю, почему ты это сделал, но это действительно не правильно. В вашем домене понятие лидера является характеристикой отношений, а не характеристикой модуля.

Пара вариантов для рассмотрения: 1) Добавьте еще одно поле в StaffModule, например, «IsLeader». Таким образом, ваши отношения M: M несут ответственность за владение тем, какие отношения являются лидером, а какие - наставниками. 2) Подумайте об изменении таблицы StaffModule на Tutors и не ставьте лидера в эту таблицу вообще. Смоделируйте эти отношения, выполнив то, что у вас уже есть… в модуле ModuleLeader, который указывает непосредственно на персонал. Стол преподавателей будет только персонал, который является наставниками. У обоих из них есть свои плюсы и минусы, которые вам нужно взвесить, чтобы решить, что лучше.

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