2015-07-09 6 views
1

Это работает:Странное поведение INCLUDE в Entity Framework

using (var dbContext = new SmartDataContext()) 
{ 
    dbContext.Configuration.ProxyCreationEnabled = false; 

    var query = dbContext.EntityMasters.OfType<Person>(); 
    if (includeAddress) 
     query.Include(p => p.Addresses); 
    if (includeFiles) 
     query.Include(p => p.FileMasters); 

    output.Entity = query.Include(s=>s.Addresses).FirstOrDefault<Person>(e => e.EntityId == id); 
} 

в то время как это не делает:

using (var dbContext = new SmartDataContext()) 
{ 
    dbContext.Configuration.ProxyCreationEnabled = false; 

    var query = dbContext.EntityMasters.OfType<Person>(); 
    if (includeAddress) 
     query.Include(p => p.Addresses); 
    if (includeFiles) 
     query.Include(p => p.FileMasters); 

    output.Entity = query.FirstOrDefault<Person>(e => e.EntityId == id); 
} 

Я пытаюсь включить адреса, файлы на основе логических флагов, поступающих из функции. Однако, похоже, EF не включает их при использовании условия IF.

Это связано с моим вопросом previous, который фактически работал с использованием Include.

+0

** Эмпирическое правило: ** Если вы хотите сказать «Редактировать», чтобы поместить в редактирования, то вам не нужно редактирование. –

ответ

2

Вы должны присвоить результат Include обратно query

query = query.Include(p => p.Addresses); 
0

Функция «Включить» фреймворка объекта работает только тогда, когда она подключена ко всему запросу linq, который просматривает объект. Это связано с тем, что запрос linq представляет собой форму Expression, которая может быть проверена в целом до ее выполнения.

Во втором примере объект Person уже отделен от базы данных, поэтому EF не имеет информации о том, из какой таблицы пришел человек и как он должен присоединиться к Лицу с таблицей адресов, чтобы получить нужные вам результаты.

Если вы включите генерацию динамического прокси, EF сможет отслеживать связь между сущностью и базой данных. Тем не менее, я не уверен, что это сделает работу include.

+0

Я не уверен в вашем заявлении. Когда вы говорите, что объект Person уже отделен от базы данных, что вы имеете в виду? Его объект IQueryable и переменная 'query' содержат запрос, который изменяется. –

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