C# 实体同时具有一对一和一对多两种关系

C# 实体同时具有一对一和一对多两种关系,c#,entity-framework,C#,Entity Framework,我有两个实体员工,分行 public class Branch { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string Name { get; set; } public int ManagerId { get; set; } public Employee Manager { get; set

我有两个实体
员工
分行

public class Branch
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string Name { get; set; }

    public int ManagerId { get; set; }
    public Employee Manager { get; set; }

    public List<Employee> Employees { get; set; }
    public List<Department> Departments { get; set; }
}


public class Employee
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int ManagerId { get; set; }
    public Employee Manager { get; set; }

    public int DepartmentId { get; set; }
    public Department Department { get; set; }

    public int BranchId { get; set; }
    public Branch Branch { get; set; }

}
我希望与
分公司
员工(经理)建立OneToOne关系,与
分公司
员工(分公司员工)建立OneToMany关系

现在,当我尝试添加迁移时,它失败了

无法确定导航所表示的关系 “员工”类型的“分行经理”属性


我理解这个问题,但无法解决它。

这个设计太不规范,导致无效关联的风险,关系需要更明确的映射

例如,如果分支机构有一名经理和一组员工,那么员工可以通过分支机构找到他们的经理。即

employee.Branch.Manager
员工和分支机构都有经理的问题是,无法确保Employee.Manager和Employee.Branch.Manager始终指向同一个人。(他们应该始终是同一个人)

一个部门也可能有一名经理,但这应该是一名更高级别的经理,其中每个分支机构都有一名向部门经理报告的经理

如果未指定FK属性和导航属性之间的FK关系,EF有时会在尝试按约定计算实体之间的关联时感到困惑。从内存中,EF约定使用属性类型,而不是属性名作为默认的预期键名

例如,给定一个属性

public virtual Employee Manager { get; set; } 

您可能希望EF计算出FK是“ManagerId”,但它会根据类型
Employee
而不是属性名称,在默认情况下尝试使用“EmployeeId”。这就是为什么需要使用
ForeignKey
属性将其显式地指向“ManagerId”作为FK,或者更好地使用
.Map(x=>x.MapKey(“ManagerId”))
或EF Core Shadow Properties,以避免在实体中与导航属性一起声明FK属性。

员工经理和分支机构经理之间的区别是什么?此外,您不应该在Employee表中包含分支机构,因为您可以通过部门获得分支机构。否则,您可能会造成一名员工的分支机构与部门的分支机构不同。@juharr每个员工都有一名经理(他所属部门的经理),每个分支机构都有许多部门,也有一名经理。我可以处理员工与部门分支机构不同的可能性。
public virtual Employee Manager { get; set; }