我明白为什么 EF 不允许 PK/FK 关系中的“循环引用”。我正在寻求有关如何更改模型以使以下场景发挥作用的建议。
Scenario
三个实体:Employee
, Agency
, WorkRecord
。他们的目的是记录员工工作所花费的时间。Employee
然后包含对Agency
他/她受雇于,并且他/她WorkRecord
包含对Agency
工作已经完成了。
public class Employee
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public int AgencyId { get; set; }
public virtual Agency Agency { get; set; }
public virtual IEnumerable<WorkRecord> WorkRecords { get; set; }
}
public class Agency
{
[Key]
public int Id { get; set; }
}
public class WorkRecord
{
[Key]
public int Id { get; set; }
public int Hours { get; set; }
public int AgencyId { get; set; }
public virtual Agency Agency { get; set; }
public int EmployeeId { get; set; }
public virtual Employee { get; set; }
}
就像这样,它会发牢骚:FK_dbo.WorkRecords_dbo.Employees_EmployeeId
导致循环参考。
实验
我的第一个想法是因为双向虚拟属性,所以我决定将两者中的一个指定为具有单向关系的顶级实体:
首先,我指定了WorkRecord
作为顶级实体并删除虚拟WorkRecords
参考参考来自Employee
实体...产生相同的消息。
其次,我做了Employee
顶级实体,留下其虚拟WorkRecords
收集,并删除虚拟Employee
参考属性来自WorkRecord
实体...工作正常,但没有实现我的目标。
经过更多调查,我发现是两个实体上的 Agency 虚拟引用属性导致了循环引用。如果一个实体删除这一点,Employee
/WorkRecord
实体关系在各个方向上发挥作用。
问题:
所以,我可以清楚地问 - 我如何表达这种商业模式,使用WorkRecord
作为我的顶级实体,而不会让 EF5 感到不安?