2015-10-05 3 views
0

У меня есть следующий оператор Entity Framework, который работает правильно.Entity Framework Include(): указанный путь Include недействителен

CostingEvent targetEvent = repository.Query<CostingEvent>() 
            .FirstOrDefault(ce => ce.Id == targetId); 

Однако, мне нужно отключить отложенную загрузку для этого кода и поэтому я добавил Include() элемент к предыдущему высказыванию:

CostingEvent targetEvent = repository.Query<CostingEvent>() 
            .Include(ce => ce.ProposalSection.Proposal.Costing) 
            .FirstOrDefault(ce => ce.Id == targetId); 

Однако это создает исключение времени выполнения:

Указанный путь Include недействителен. EntityType «Leo.Domain.CostingEvent» не объявляет свойство навигации с именем «Costing».

Я действительно не понимаю эту ошибку. Прежде всего, я не ссылаюсь на CostingEvent.Costing, я ссылаюсь на CostingEvent.ProposalSection.Proposal.Costing. Кроме того, это все допустимые навигационные свойства, которые появляются в Intellisense.

Примечание: это приложение первой базы данных. Также обратите внимание: repository является классом-оболочкой, а ссылка Include() является стандартной платформой Entity Framework.

+0

И я полагаю, что все свойства отображаются? –

+0

Не могли бы вы представить суть соответствующих классов? Это должно работать так, как есть. –

ответ

0

Вложенные EF Включает сложнее.

Рассматривали ли вы

CostingEvent targetEvent = repository.Query<CostingEvent>() 
           .Include("ProposalSection.Proposal.Costing") 
           .FirstOrDefault(ce => ce.Id == targetId); 

Это может также работать

CostingEvent targetEvent = repository.Query<CostingEvent>() 
           .Include(ce => ce.ProposalSection) 
           .Include(ce => ce.ProposalSection.Proposal) 
           .Include(ce => ce.ProposalSection.Proposal.Costing) 
           .FirstOrDefault(ce => ce.Id == targetId); 
+0

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

+0

Это не совсем так, и третий Include - это все, что вам нужно (это подразумевает предыдущие два). –

0

Вы должны выбрать свойства subnavigation, как это:

CostingEvent targetEvent = repository.Query<CostingEvent>() 
            .Include(ce => ce.ProposalSection.Select(ps=>ps.Proposal.Select(p=>p.Costing))) 
            .FirstOrDefault(ce => ce.Id == targetId); 
+0

Не 'Select()' требует коллекцию слева от точки? 'Предложение и его предложение 'являются единственными. –

+0

Да, для выбора обычно требуется коллекция слева. Является ли калькулятором свойство навигации или просто свойство предложения? Если Costing - это просто обычное свойство, то вам не нужно его иметь, просто закончите предложение. –

Смежные вопросы