Entity Framework 6 Установите связь от имени ID или значения enum - PullRequest
0 голосов
/ 04 марта 2019

В моей БД у меня есть связь между некоторыми таблицами, которая опирается либо на ID, либо на значение Enum.Вот структура:

Сотрудник

  • ID
  • Имя
  • RoleEnum (CEO, Leader, Developer)
  • Виртуальный список преимуществ

Преимущества

  • ID
  • Описание

EmployeeAdvantages

  • ID
  • AdvantagesID
  • EmployeeID (Nullable) *
  • RoleEnum (Nullable) *

*) только один из них будет иметь значение для каждой строки

Отношение между Employee и Advantages может быть основано либо на прямом отношении на основе EmployeeID и AdvantagesID, либо на основе RoleEnum.

Поэтому, когда я загружаю Employee с помощью EF, мне бы хотелось, чтобы виртуальный список преимуществ заполнялся автоматически, и это поведение также работает, когда отношение основано на EmployeeID и AdvantagesID, НО, когда оно основанона RoleEnum это, конечно, не работает из коробки, но не возможно настроить EF tсправиться с этой ситуацией?Таким образом, если сотрудник имеет роль «генерального директора», он загрузит все отношения, основанные на этой роли, в EmployeeAdvantages?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Лучше с точки зрения реляционного моделирования отделить Advantage с Employee с от Advantage с Role с.

Лучше иметь отдельную таблицу типа RoleAdvantages Таким образом, вы можете установить отношения между Employee и RoleAdvantage на основе роли сотрудника и, таким образом, автоматически загрузить Advantages этого Role.Вы только тогда должны собрать Advantage s из обеих коллекций.

0 голосов
/ 05 марта 2019

Насколько я знаю, то, что вы хотите, не возможно.Но вы можете создать расширение для Employee, где вы вручную загрузите EmployeeAdvantages, которые проходят через RoleEnum.По сути, вы бы сделали это в своем методе расширения:

public static class EmployeeExtension
{
  public static int VirtualListOfAdvantages(this Employee employee)
  {
    var repo = new EmployeeAdvantagesRepository();
    var enumRoleAdvantages = 
        repo.GetAll().Where(ea => ea.RoleEnum == employee.RoleEnum).ToList();
    enumRoleAdvantages.AddRange(employee.VirtualListOfAdvantages);

    return enumRoleAdvantages;
  }
}

(я не знаю, как будет выглядеть ваш репозиторий, но я думаю, вы поняли)

Это, конечно, нерешение, которое вы искали, но это правильное и довольно простое решение, которое должно хорошо работать.

Подробнее о методах расширения (и взятом из примера): Как: реализовать и вызвать пользовательский метод расширения

...