У меня есть следующий код: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 для подотчетности и т. Д.).
Как я могу описать эти разные свойства для ссылки на один и тот же столбец?
При создании этого сопоставления EF добавляет индивидуальный идентификационный столбец для каждого из задач Свойства в таблицу класса UserTaskResponsibility. Ваше предложение работает только при использовании одной коллекции того же типа. Тем не менее, похоже, что пропустить конфигурацию fluent-API для ссылки на тот же столбец TaskID, поскольку DataAnnotations недоступны. –
Я думаю, что вы немного смущены. EF делает все правильно (сделано несколько столбцов ID). У вас в вашем варианте есть избыточность: столбец «Ответственность» с столбцами ИД. Если это, например, «Ответственный», то TaskID не будет равным нулю, так же: «Подотчетный» - TaskTaskID и т. Д. (Не имеет значения null уже сказано об «Ответственности»). По моему варианту, да, у вас есть одна коллекция, но какая-то ссылка, которую вы укажете в столбце «Ответственность», так как она будет эквивалентна тому, что вы хотите. –
Дело в том, что вместо того, чтобы скрывать необходимую информацию для работы с объектом в списке, который необходимо фильтровать снова и снова, я хочу, чтобы объект служил необходимой информации в виде свойств. Позвольте мне перефразировать его: когда я использую ваш ответ, я хочу добавить еще 4 свойства, обслуживающие отфильтрованную виртуальную коллекцию ICollection Links {get; set;}. И, написав это, я понимаю, что это должно быть реализовано через интерфейс. Большое спасибо! –