EntityFramework流畅的API“孙子”关系映射

时间:2011-12-12 23:35:31

标签: .net entity-framework fluent database-first ef-database-first

我正试图在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属性以进行延迟加载。

我错过了什么?

1 个答案:

答案 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。因此,只有在急切加载时才使用它。