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中排除。