0

我想映射什麼看起來像在EF流利的API非常常見的情況下,並打了一堵牆。我有以下類:EntityFramework流利的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;} 
} 

用下面的表格:

公司
標識 - 詮釋

司:
標識 - INT CompanyId INT(FK)

員工
標識 - 詮釋
名稱 - VARCHAR(50)
DivisionId - INT(FK)

如果僱員表有一個CompanyID FK,這個映射將是非常簡單的:

HasMany(c=>c.Employees).WithRequired().HasForeignKey(e=>e.CompanyId); 

然而,因爲我沒有從Employee表到Company表的直接FK,我似乎無法映射Company對象中的Employees屬性進行延遲加載。

我錯過了什麼?

回答

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,之後它將調用單獨的延遲加載查詢爲每個Division = N + 1問題加載Employees。所以只能在急切加載時使用它。