Сопоставление отношений внуков EntityFramework Fluent API

Я пытаюсь сопоставить то, что кажется очень распространенным случаем в свободном API EF, и наткнулся на стену. У меня есть следующие классы:

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)

Идентификатор сотрудника
– int
Имя – varchar(50)
DivisionId – int (FK)

Если бы таблица Employee имела FK CompanyID, это сопоставление было бы очень простым:

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

Однако, поскольку у меня нет прямого FK из таблицы «Сотрудники» в таблицу «Компания», я, похоже, не могу сопоставить свойство «Сотрудники» в объекте «Компания» для отложенной загрузки.

Что мне не хватает?


person R M    schedule 12.12.2011    source источник


Ответы (1)


Вы не можете нанести это на карту. Сначала код 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 для каждой Division = N + 1 проблемы. Так что используйте это только с нетерпеливой загрузкой.

person Ladislav Mrnka    schedule 12.12.2011