gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:56:30 25 4
gpt4 key购买 nike

我有两个实体 Employee , Branch

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

}
每个分公司有很多部门,每个部门有很多员工,每个员工属于一个部门和一个分公司
数据库方案应如下所示:
Branch     : Id , Name , ManagerId
Department : Id , Name , ManagerId
Employee : Id , Name , DepartmentId , BranchId, ManagerId #(department manager)
我要 一对一 Branch 的关系与 Employee (经理)和 一对多 Branch 的关系与 Employee (分行员工)
现在当我尝试添加迁移时,它失败了

Unable to determine the relationship represented by navigationproperty 'Branch.Manager' of type 'Employee'


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

最佳答案

这种设计过于非规范化,导致存在无效关联的风险,以及关系需要更明确的映射。
例如,如果一个 Branch 有一个 Manager 和一组员工,那么员工可以通过 Branch 获得他们的经理。 IE。

employee.Branch.Manager
在 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 属性。

关于c# - 实体同时具有一对一和一对多两种关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63800609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com