我正试图在EF流畅的API中映射一个非常常见的情况并且已经碰壁了。我有以下课程:
public class Company
{
public int Id { get; set; }
public virtual List<Division> Divisions { get; set; }
public virtual List<Employee> Employees { get; set; }
}
public class Division
{
public int Id { get; set; }
public virtual List<Employee> Employees { get; set; }
public virtual Company Company { get; set; }
}
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Division Division {get; set;}
}
使用以下表格:
公司
Id - int
司:
Id - int
CompanyId int(FK)
员工
Id - int
名称 - varchar(50)
DivisionId - int(FK)
如果Employee表具有CompanyID FK,则此映射将非常简单:
HasMany(c=>c.Employees).WithRequired().HasForeignKey(e=>e.CompanyId);
但是,由于我没有从Employee表到Company表的直接FK,我似乎无法在Company对象中映射Employees属性以进行延迟加载。
我错过了什么?
答案 0 :(得分:0)
你无法映射。 EF代码首先只能映射物理关系。因此,如果您的员工没有CompanyId
FK,那么它与Company
表也没有物理关系。作为解决方法,您可以使用非映射属性:
public class Company
{
public int Id { get; set; }
public virtual List<Division> Divisions { get; set; }
public IEnumerable<Employee> Employees
{
get
{
return Divisions.SelectMany(d => d.Employees);
}
}
}
此解决方案无法解决您对延迟加载的要求(但会以可怕的方式)。在没有加载关系的情况下调用Employees
将执行对延迟加载Divisions
的查询,之后它将调用单独的延迟加载查询以加载Employees
= N + 1问题的Division
。因此,只有在急切加载时才使用它。