0

我正在尝试使用 CodeFirst 来生成我的数据库。

我有两张表StaffTeam每个团队中有一个团队负责人,它是员工 ID 的外键,每个员工都与一个团队相关联。

public class Staff
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Username { get; set; }
    public string PasswordHash { get; set; }
    public string Salt { get; set; }
    public string Token { get; set; }
    public string Mobile { get; set; }
    public string Email { get; set; }
    public bool Admin { get; set; }
    public bool Active { get; set; }

    public int TeamID { get; set; }

    [ForeignKey("TeamID")]
    public Team Team { get; set; }
}

public class Team
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public int TeamLeaderID { get; set; }

    [ForeignKey("TeamLeaderID")]
    public Staff TeamLeader { get; set; }
}

因为每个人都指向另一个人,所以我收到一个错误Unable to determine the principal end of an association between the types 'Team' and 'Staff'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations. 我如何以一种理解我为什么这样做的方式对其进行注释。

4

2 回答 2

1

这样想……团队或团队负责人首先是什么?如果您尝试创建团队负责人,则不能,因为您必须首先指定一个团队!但是如果你想创建一个团队你不能,因为你必须根据你的外键约束来指定团队负责人是谁。

您将不得不以某种方式放松,或者让团队可以有一个可选的团队领导,或者一个工作人员可以选择属于一个团队。

为此,您可以将其中一个外键 ID 更改为可为空的类型:

public int? TeamLeaderID { get; set; }
于 2013-10-18T04:32:05.190 回答
0

您的代码似乎正试图通过参照完整性包含业务规则执行/责任。您的团队 -> 员工是一对多的关系。您只需为 TeamLeader 添加一个布尔值。在进行数据库写入之前,您的逻辑应该检查您是否有现有的 TeamLeader。

public class Staff
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Username { get; set; }
    public string PasswordHash { get; set; }
    public string Salt { get; set; }
    public string Token { get; set; }
    public string Mobile { get; set; }
    public string Email { get; set; }
    public bool Admin { get; set; }
    public bool Active { get; set; }
    public IsTeamLeader { get; set; }

}

public class Team
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }

    //virtual keyword tells Code First to create the proper Foreign Key relationship 
    public virtual List<Staff> Members{ get; set; }
}

如果您有一个包含许多开发人员的大型系统,您可以使用 fluent API 来实现您的目标并在数据库级别强制执行您的团队负责人规则,从而防止脱节的开发人员无意中将第二个团队负责人添加到任何给定团队但如果这是一个小型到正常规模的项目,与了解公司/项目基础的小型团队相比,简单的一对多关系将完成任务,您可以依靠您的业务规则/逻辑来执行/保护数据库数据,以便任何给定团队在任何给定时间都有一个团队负责人。考虑一个 AddUpdateTeamMember 类型的方法,该方法由强制执行团队领导要求的每个人调用。

还要考虑一下,如果在项目的某个未来时间点需要两个团队领导在一个团队中,那么数据库可能会变得太不方便“锁定”以适应这种变化。

于 2013-10-18T04:32:36.860 回答