Таблица EF для каждого типа со свойством Navigation в таблице подтипов - PullRequest
1 голос
/ 23 декабря 2010

Я надеюсь, что кто-то из сообщества SO сможет помочь мне здесь.

Упрощенный фон: Я использую Entity Framework V1 для построения структуры моего класса, которая описана ниже, я использую Table Per Type для сохранения моих унаследованных объектов:

Employee 
CaseA : Case
CaseB : Case
CaseC : Case

CaseB имеет навигационное свойство для сотрудника

У меня есть репозиторий, который возвращает ObjectQuery. Если тип Case на самом деле CaseB, мне нужно включить объект Employee в график. Я не могу .Include ("Сотрудник"), потому что это не навигационное свойство Case, и у Сотрудника нет метода .Load ().

В идеале я хочу иметь возможность сделать это в одном запросе, однако, как запасной вариант, я счастлив, что я совершаю вызов, проверяю объект и выполняю другой вызов, примерно так: (хотя, как я уже говорил ранее, нагрузка на навигационное свойство сотрудника отсутствует)

    //Get the case from the 
    Case myCase = new Repo<Case, Entities>.FirstOrDefault();

    if(myCase is CaseB)
       ((CaseB)myCase).Employees.load();

Я что-то упускаю здесь очень просто?

Ответы [ 2 ]

3 голосов
/ 24 декабря 2010

Попробуйте это:

var employee = ctx.Cases
                  .OfType<CaseB>()
                  .Include("Employees")
                  .Select(x => x.Employees)
                  .FirstOrDefault();

OfType<T>() - это один из самых важных методов в EF, когда речь идет о наследовании - вам следует ознакомиться с ним.

По сути, фильтры в запросе относятся к определенному типу - очень похоже на условную проверку ваших действий в ответе.

Это метод IQueryable (LINQ-Objects), но в LINQ-Entities (ObjectQuery<T>) он реализован как INNER JOIN.

Вышеуказанное должно работать - просто убедитесь, что вы выполняете энергичную нагрузку после того, как вы выполните OfType.

НТН.

0 голосов
/ 23 декабря 2010

Как всегда, после публикации вопроса я нашел это и это , которое указало мне на использование проекции (решение ниже), но я надеялся избежать этого, поэтому я ' Я собираюсь оставить вопрос открытым, чтобы увидеть, есть ли более элегантное решение.

var Employee = caseObjectQuery.Select(x => new{
                Employee = x is CaseB ? (x as CaseB).Employee : null
            }
            ).FirstOrDefault();

Просто выбрав Объект в память, EF волшебным образом отображает связанные объекты.

...