0

我正在尝试映射 EF fluent 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 属性以进行延迟加载。

我错过了什么?

4

1 回答 1

0

你不能映射那个。EF 代码首先只能映射物理关系。因此,如果您的员工没有FK,那么它也与桌子CompanyId没有物理关系。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每个Division= N + 1 个问题。因此,仅在急切加载时使用它。

于 2011-12-12T23:54:59.430 回答