2015-12-29 2 views
0

У меня есть следующий код:EF7 консолидировать многие ко-многим

public class User { 
    public int ID {get;set;} 
    public virtual ICollection<Task> Tasks {get;set;} 
} 

public class Task { 
    public int ID {get;set;} 
    public string Description {get;set;} 
    public virtual ICollection<User> Responsible {get;set;} 
    public virtual ICollection<User> Accountable {get;set;} 
    public virtual ICollection<User> Consulted {get;set;} 
    public virtual ICollection<User> Informed {get;set;} 
} 

Теперь я могу использовать свободно API для создания этих отношений, однако это создает новую таблицу для каждого из этих свойств:

ResponsibleID | UserID | TaskID 
------------------------------- 
1    | 1  | 1 

AccountableID | UserID | TaskID 
------------------------------- 
1    | 1  | 1 

etc. 

Но я бы предпочел бы хранить их в одной таблице:

ResponsibilityID | UserID | TaskID | Responsibility 
---------------------------------------------------- 
1    | 1  | 1  | Responsible 
2    | 1  | 1  | Accountable 
3    | 3  | 1  | Consulted 
4    | 17  | 1  | Informed 

много-т о-много класс должен выглядеть примерно так:

public class UserTaskResponsibility { 
    public ID {get;set;} 
    public User User {get;set;} 
    public Task Task {get;set;} 
    public UserResponsibility Responsibility{get;set;} 
} 

public enum UserResponsibility { 
    Responsible, 
    Accountable, 
    Consulted, 
    Informed 
} 

Edit: Используя этот класс, я изменил свойства для

public class User { 
    public int ID {get;set;} 
    public virtual ICollection<UserTaskResponsibility> Tasks {get;set;} 
} 

public class Task { 
    public int ID {get;set;} 
    public string Description {get;set;} 
    public virtual ICollection<UserTaskResponsibility> Responsible {get;set;} 
    public virtual ICollection<UserTaskResponsibility> Accountable {get;set;} 
    public virtual ICollection<UserTaskResponsibility> Consulted {get;set;} 
    public virtual ICollection<UserTaskResponsibility> Informed {get;set;} 
} 

Таблица создана результаты в

ResponsibilityID | UserID | TaskID | Responsibility | TaskTaskID | TaskTaskTaskID | TaskTaskTaskTaskID 
------------------------------------------------------------------------------------------------------ 
1    | 1  | 1  | Responsible | Null  | Null   | Null    
2    | 1  | 1  | Accountable | Null  | Null   | Null    
3    | 3  | 1  | Consulted  | Null  | Null   | Null    
4    | 17  | 1  | Informed  | Null  | Null   | Null    

Это добавляет дополнительный ID-столбец для каждой ссылки коллекции. (Задача для ответственного, TaskTask для подотчетности и т. Д.).

Как я могу описать эти разные свойства для ссылки на один и тот же столбец?

ответ

0

Вы уже ответили на ваш вопрос! Добавить класс UserTaskResponsibility в свой DataContext как новая таблица, а затем изменить свои модели, как это:

public class User { 
    public int ID {get;set;} 
    public virtual ICollection<UserTaskResponsibility> Links {get;set;} 
} 

public class Task { 
    public int ID {get;set;} 
    public string Description {get;set;} 
    public virtual ICollection<UserTaskResponsibility> Links {get;set;} 
} 
+0

При создании этого сопоставления EF добавляет индивидуальный идентификационный столбец для каждого из задач Свойства в таблицу класса UserTaskResponsibility. Ваше предложение работает только при использовании одной коллекции того же типа. Тем не менее, похоже, что пропустить конфигурацию fluent-API для ссылки на тот же столбец TaskID, поскольку DataAnnotations недоступны. –

+0

Я думаю, что вы немного смущены. EF делает все правильно (сделано несколько столбцов ID). У вас в вашем варианте есть избыточность: столбец «Ответственность» с столбцами ИД. Если это, например, «Ответственный», то TaskID не будет равным нулю, так же: «Подотчетный» - TaskTaskID и т. Д. (Не имеет значения null уже сказано об «Ответственности»). По моему варианту, да, у вас есть одна коллекция, но какая-то ссылка, которую вы укажете в столбце «Ответственность», так как она будет эквивалентна тому, что вы хотите. –

+0

Дело в том, что вместо того, чтобы скрывать необходимую информацию для работы с объектом в списке, который необходимо фильтровать снова и снова, я хочу, чтобы объект служил необходимой информации в виде свойств. Позвольте мне перефразировать его: когда я использую ваш ответ, я хочу добавить еще 4 свойства, обслуживающие отфильтрованную виртуальную коллекцию ICollection Links {get; set;}. И, написав это, я понимаю, что это должно быть реализовано через интерфейс. Большое спасибо! –

Смежные вопросы