Entity framework EF7巩固多对多关系
我有以下示例代码:Entity framework EF7巩固多对多关系,entity-framework,entity-framework-core,Entity Framework,Entity Framework Core,我有以下示例代码: 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
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;}
}
但我更愿意将它们存储在一张表中:
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
}
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;}
}
编辑:
使用这个类,我将属性更改为
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;}
}
它为集合的每个引用添加一个附加的ID列。(负责人任务、负责人任务等)
如何让这些不同的属性引用同一列?您已经回答了您的问题!将UserTaskResponsibility类作为新表添加到datacontext中,然后按如下方式更改模型:
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
}
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;}
}
公共类用户{
公共int ID{get;set;}
公共虚拟ICollection链接{get;set;}
}
公开课任务{
公共int ID{get;set;}
公共字符串说明{get;set;}
公共虚拟ICollection链接{get;set;}
}
创建此映射时,EF会将每个任务属性的单独ID列添加到UserTaskResponsibility类的表中。您的建议仅在使用同一类型的单个集合时有效。这就是说,由于DataAnnotations不可用,引用同一TaskID列的fluent API配置似乎丢失了。EF正确执行所有操作(由多个ID列组成)。您的变体有一些冗余:带有ID列的列“责任”。例如,如果它是“负责任的”,那么只有TaskID将不为null,同样的方式是:“负责任的”-TaskID等等(关于“责任”已经说过了,不为null)。在我的变体中,是的,您有一个集合,但您将在“责任”列中指定的链接类型,这样它将与您想要的内容等效。问题是,与其在需要反复筛选的列表中隐藏处理对象所需的信息,我希望对象以属性的形式提供必要的信息。让我重新表述一下:当我使用您的答案时,我需要4个额外的属性为过滤后的虚拟ICollection链接{get;set;}集合提供服务。写这篇文章我意识到这应该通过一个接口来实现。非常感谢你!我想他理解你的想法。您将向任务
添加四个属性,类似于:公共责任列表{get{return Links.Where(x=>x.Responsibility==UserResponsibility.Responsible.ToList();}
。是的,这是一个意外的解决方案,为您提供了所需的功能,但不要忘记将[NotMapped]
属性添加到此属性以将其从ORM中排除。