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; }