如何使用实体框架管理多对多关系

时间:2018-11-15 14:37:43

标签: entity-framework

我正在使用Entity Framework创建MVC应用程序,并且正在使用Code First约定。我不确定有什么特殊的关系。

Image to show relationship

我添加了人员角色,以打破人员与模块之间的多对多关系。一个模块应始终具有一个模块负责人和许多导师。目前,我的实体看起来像这样:

public class Staff
{
    public int StaffId { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    public string EmailAddress { get; set; }

    public int? PhoneNumber { get; set; }

    public string Full
    {
        get
        {
            return LastName + ", " + FirstName;
        }
    }

    public virtual List<StaffRole> Roles { get; set; }

}

   public enum StaffModuleRoles
{
    Leader,
    Tutor
}


public class StaffRole
{
    [Key, ForeignKey("Staff"), Column(Order = 0)]
    public int StaffId { get; set; }

    [Key, ForeignKey("Module"), Column(Order = 1)]
    public string ModuleCode { get; set; }

    public StaffModuleRoles Role { get; set; }

    public Staff Staff { get; set; }

    public Module Module { get; set; }
}

 public class Module
{

    [Key]
    public string ModuleCode { get; set; }

    [MaxLength(50)]
    [Required]
    public string Title { get; set; }

    public string Description { get; set; }

    public List<Enrolment> Enrolments { get; set; }

    public Staff ModuleLeader { get; set; }

    public virtual List<Staff> Tutors { get; set; }

}

这里的最佳做法是什么?如您所见,我主要使用数据注释,而且对于EF和一般的编码我还是很陌生。

我们将不胜感激,也感谢您为实体植入种子的提示。

根据评论进行编辑

我想知道我的数据库设计是否正确,如果正确,我如何使用实体框架创建它。

1 个答案:

答案 0 :(得分:0)

对于您的设计,您可能需要重新考虑这些表的结构。这就是为什么我这么说。通过为模块实体提供ModuleLeader属性,您实际上是在说“一个模块只能有1个职员”,然后与StaffModule混合使用M:M关系,即“一个模块可以有许多职员”。我知道您为什么这样做,但这确实不是正确的选择。在您的领域中,领导者的概念是关系的特征,而不是模块的特征。

要考虑的选项对:1)向StaffModule添加另一个字段,例如“ IsLeader”。这样,您的M:M关系将负责拥有哪些关系是领导者,哪些是辅导者。 2)考虑将您的StaffModule表更改为Tutors,并且根本不要将领导者放在该表中。通过做已有的事情来建立这种关系的模型。...模块上的ModuleLeader直接指向职员。导师表只能是作为导师的职员。两者都有优点/缺点,您需要权衡才能决定最好的方法。