2013-06-20 2 views
0

У меня есть следующий домен.Как указать состав в модели EF?

Роль является абстрактным классом. Программист расширяет роль. Сотрудник имеет несколько ролей, таких как программист, менеджер и т. Д.

Я хочу создать для него модель. Как мы можем указать этот элемент composition роли «Роли в служащих»?

Примечание: я не могу добавить таблицу EmpID в таблицу ролей. Потому что одна и та же роль будет применима для многих сотрудников.

Текущая модель

enter image description here

Псевдо Код для Required концептуальной модели

public abstract class Role 
{ 
    public abstract string RoleName { get; } 
    public abstract int RoleID { get; } 
} 

public class ProgrammerRole : Role 
{ 
    public override string RoleName { get { return "Programmer"; } } 
    public override int RoleID { get { return 101; } } 
} 

public class ManagerRole : Role 
{ 
    public override string RoleName { get { return "Manager"; } } 
    public override int RoleID { get { return 102; } } 
} 


public class Employee 
{ 
    private IList<Role> roles; 
    public IList<Role> RolesList 
    { 
     get 
     { 
      return roles; 
     } 
    } 


    public int EmployeeID { get; set; } 

    //Constructor 
    public Employee() 
    { 
     roles = new List<Role>(); 
    } 

    public void TerminateEmployeeByRole(Role role) 
    { 
     if (RolesList == null) 
     { 
      //If employee has no role, make as inactive 
      isActiveEmployee = false; 
     } 
     else 
     { 
      //If employee has no role other than the input role, make as inactive 
      RolesList.Remove(role); 
      if (RolesList.Count == 0) 
      { 
       isActiveEmployee = false; 
      } 
     } 
    } 

} 
+1

Вообще говоря, каждый класс модели обычно представляет собой объект коллекции, такой как 'table', поэтому' class Employee' представляет таблицу 'Employee'. Аналогично, 'ProgrammerRole' и' ManagerRole' будут создавать две таблицы в базе данных. Я уверен, что это не то, что вы хотите. –

ответ

0

Это может быть реализовано более простым способом:

public class Role 
{ 
    public string RoleName { get; } 
    public int RoleID { get; } 
} 

public class Employee 
{ 
    public IList<int> RoleID { get; set; } // to store role id. This would form a table column 
    [ForeignKey("RoleID")] 
    public virtual IList<Role> RolesList { get; set; } // to reference Roles in the code. This will not for a table column 

    public int EmployeeID { get; set; } 

    //Constructor 
    public Employee() 
    { 
     roles = new List<Role>(); 
    } 

    public void TerminateEmployeeByRole(Role role) 
    { 
     if (RolesList == null) 
     { 
      //If employee has no role, make as inactive 
      isActiveEmployee = false; 
     } 
     else 
     { 
      //If employee has no role other than the input role, make as inactive 
      RolesList.Remove(role); 
      if (RolesList.Count == 0) 
      { 
       isActiveEmployee = false; 
      } 
     } 
    } 
} 

Причина этого дизайна в том, что вы не сможете создавать больше классов, если добавлено больше ролей. Вы можете создать класс-оболочку для извлечения сведений о роли из базы данных.

Используйте этот как отправную точку, а не как решение для копирования-вставки.