Entity Framework - Наследование с .Include? - PullRequest
9 голосов
/ 22 сентября 2009

Я думаю, что здесь есть подобный пост об этом, но не совсем то же самое ...

У меня есть две сущности в моей модели EF - назовем их Person и Developer, причем последние наследуют от первой.

У меня также есть ассоциация разработчиков, которая называется «Квалификации». Это не видно на сущности Person.

Если я пишу запрос к контексту, как мне автоматически .Include () Квалификации разработчика, например

от сотрудника в контексте. Работник .Include («Квалификация») выберите сотрудника

не работает ... EF жалуется, что отношения не существуют (я полагаю, потому что они не существуют в Employee - но в контексте нет сущности Developer, просто Employee).

Ответы [ 4 ]

12 голосов
/ 18 января 2010

Я сталкивался с этой проблемой и немного экспериментировал. Вот что я обнаружил, работая с помощью LINQ 2. Entity.

Скажем, у нас в вашем примере Персона <- Разработчик ---- Квалификация. </p>

Если вы хотите выбрать разработчика с включенными квалификациями, вы должны сделать это.

var dev = (from d in context.Persons.OfType<Developer>
                            .Include("Qualifications")
          where d.ID == id
          select d).FirstOfDefault();

Теперь предположим, что у нас есть другая связь между Персоном и Адресом, мы также можем включить Адрес в выборку, также используя LINQ 2. Entity.

var dev = (from d in context.Persons
                            .Include("Address")
                            .OfType<Developer>()
                            .Include("Qualifications")
          where d.ID == id
          select d).FirstOfDefault();

Обратите внимание, как я включил то, что мне было нужно до того, как я преобразовал Тип, а также снова включил после преобразования. Оба включения теперь должны работать без проблем. Я проверил эти методы, и они оба работают. Я надеюсь, что они работают на вас, если вы правильно настроили наследование.

GL.

3 голосов
/ 25 августа 2014

На основании ответа Tri Q, но для тех, кто предпочитает подход .Load (), вы можете использовать:

context.Persons.OfType<Developer>().Include(t => t.Qualifications).Load();

Я использую его внутри моего DbContext. Я создал метод LoadDb (), который загружает все нужные мне данные. Так что я могу использовать его во многих проектах.

3 голосов
/ 23 сентября 2009

Как насчет этого:

var results = from developer in ctx.Employee.OfType<Developer>()
              select new {developer, Qualifications = developer.Qualifications};

Здесь интересны вещи:

  1. мы исключаем сотрудников, которые не разработчики
  2. тогда мы проецируем их квалификации, и как побочный эффект этой проекции, что называется Fixup с заполнением каждого Разработчик. Квалификация тоже. То есть это еще один способ достижения тот же эффект, что и Include ().

если вы впоследствии сделаете это:

var developers = from anon in developers.AsEnumerable()
                 select anon.Developer;

Вы получите только разработчиков, и у них тоже будут загружены их квалификации.

См. Совет 1 для получения дополнительной информации о том, почему это работает

Надеюсь, это поможет

Alex

0 голосов
/ 22 сентября 2009

Я не знаком с EF, но для меня это похоже на стандартную проблему наследования. Если вы хотите получить доступ к уникальным свойствам дочернего класса из коллекции «родительских» объектов (где фактические объекты могут быть или не быть экземплярами дочернего класса), вам необходимо проверить тип объекта и привести его к дочернему. при необходимости вы можете получить доступ к уникальным свойствам.

Что бы вы ожидали от данного оператора, если бы некоторые или все объекты были человеком, а не разработчиком?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...