EntityFramework свободно API-интерфейс сопоставления "внучатых" отношений - PullRequest
0 голосов
/ 13 декабря 2011

Я пытаюсь отобразить то, что кажется очень распространенным случаем в плавном 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;}
}

Со следующими таблицами:

Компания
Id - int

Отдел:
Id - int CompanyId int (FK)

Employee
Id - int
Имя - варчар (50)
DivisionId - int (FK)

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

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

Однако, поскольку у меня нет прямого FK из таблицы Employee в таблицу Company, я не могу отобразить свойство Employees в объекте Company для отложенной загрузки.

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

1 Ответ

0 голосов
/ 13 декабря 2011

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

...