9

У меня есть конкретный запрос в моем коде, который должен стремиться загружать все связанные объекты (оба -> 1 FKs и -> N FK), потому что контекст будет удален сразу после этого ,EF Code First: Включить не работает на необязательные отношения

Я сделал общий метод «Запрос», который принимает params Expression<Func<MyItem, object>>[] includes, а затем внутренне их цепочки. Эта часть отлично работает.

Запрос выглядит следующим образом:

var item = facade.Query<MyItem>(
       c => c.Childs.Select(x => x.Parent), 
       c => c.Childs.Select(x => x.SubChild1), 
       c => c.Childs.Select(x => x.SubChildNotWorking), 
       c => c.Childs.Select(x => x.SubChild2), 
       c => c.Childs.Select(x => x.SubChild3), 
       c => c.Childs.Select(x => x.SubChildrens) 
       ).FirstOrDefault(c => c.Name == name); 

Отображение для не работающего имущества (помещенной в конфигурации SubChildNotWorking):

this.HasMany(scnw => scnw.Childs).WithOptional(c => c.SubChildNotWorking).HasForeignKey(c => c.MyForeignKey); 

Из всех включает в себя только SubChildNotWorking Безразлично» t действительно работает. При проверке с отладчиком возвращаемого объекта я вижу прокси-серверы во всех свойствах. Открытие прокси дает мне правильные данные для всех других отношений, а «Объектконтекст уже был исключен» для свойства SubChildNotWorking.

Единственная разница, которую я смог определить, заключается в том, что SubChildNotWorking является NULL-кодом FK (с нулевым столбцом в базе данных DB и WithOptional в dbcontext), а все остальные - с недействительными FK, настроенными с помощью WithRequired.

База данных также является устаревшей БД, не созданной с использованием кода First и не выполняющей ее соглашения, я просто сделал сопоставления в DbContext. Все остальное отлично работает.

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

Это ошибка или предполагаемое поведение? Но, прежде всего, как я могу это решить?

Спасибо.

+0

Что произойдет, если вы включите только 'SubChildNotWorking' без других subchildren? Так ли это работает? – Slauma

+0

Нет. Не работает. –

+1

Вы можете проверить, правильно ли выглядит SQL (с помощью 'var sql = facade.Query (c => c.Childs.Select (x => x.SubChildNotWorking)). ToString();') и проверить запрос вручную в SSMS, если он возвращает ожидаемые строки результатов. – Slauma

ответ

0

ли вы определить

[DataContract] 

на классе (лиц)? Если да, то не забудьте аннотировать SubChild с

[DataMember] 

или это может в конечном итоге загружен, но не отображается, когда вы выполняете свой GET вызов лиц.

0

Когда вы работаете с методом include, вы говорите об активном шаблоне загрузки. Объекты с отношениями будут загружаться как коллекции. Для любого невооруженного внешнего ключа существует тривиальная коллекция, пустая, но для обнуляемых - нет. В первом коде вы можете сделать свойство навигации виртуальным, но это не ваш случай. Вы можете попробовать загрузить его непосредственно на контексте, например:

var someEntity = context.someEntities.Find(1); 
context.Entry(someEntity).Reference(e => e.EntityWithFKNullable).Load(); 

или сокращенный вариант:

context.EntitiesWithFKNullable.Load();