2012-06-13 3 views
3

Если у меня есть 3 таблицы:Entity Framework 4 нагрузки и включают в себя объединить

Table1, Table2, Таблица3

И Таблица3 имеет FK для Table2, который имеет FK для Table1

Тогда я загружаю мой объект, как это:

using(Entities entities = new Entities() 
{ 
    Table1 table = entities.Table1.FirstOrDefault(); 
    table.Table2.Load(); 
} 

Как я могу с нетерпением нагрузки на Таблицу 3 tABLE2, потому что LazyLoading выключен.

Я знаю, что я могу использовать Include в инструкции FirstOrDefault, но он будет генерировать слишком большое соединение.

ОТВЕТ

using(Entities entities = new Entities()) 
{ 
    Table1 table = entities.Table1.FirstOrDefault(); 
    var table2 = table.Table2.CreateSourceQuery().Include("Table3") 
     .Execute(MergeOption.AppendOnly); 
    table.Table2.Attach(table2); 
} 
+1

определить «слишком большое соединение». Использование include не должно отличаться от использования Load, кроме того, что происходит в одном запросе. –

+0

Без загрузки отдельный запрос будет выполняться только для получения записей заграничных таблиц. Проблема в том, что в Таблице 3 также есть 5 внешних таблиц, которые необходимо загрузить. Запрос, сохраненный в блокноте, составляет около 100 кб. У меня скорее есть отдельный запрос для иностранных записей (что и делает загрузка). – YesMan85

ответ

3

Как я могу с нетерпением нагрузки на Таблицу 3 TABLE2 потому что LazyLoading является выключен.

Вы можете попробовать:

using(Entities entities = new Entities()) 
{ 
    Table1 table = entities.Table1.FirstOrDefault(); 
    table.Table2.CreateSourceQuery().Include("Table3") 
     .Execute(MergeOption.AppendOnly); 
} 

Я предполагаю, что вы используете объекты, полученные из EntityObject, не Pocos, т.е. table.Table2 является EntityCollection<T> или EntityReference<T>. Я не уверен на 100%, если вышеуказанный код будет работать так, как ожидалось.

+0

Отмечено это как ответ и добавило его на мой вопрос, потому что вы забыли жизненно важную вещь: снова добавили таблицу2 в таблицу :) – YesMan85

+0

@ Rogier21: Это был именно тот момент, когда я был не уверен, что 'Execute' сделает это или нет. EF> = 4.1 имеет метод расширения 'IQueryable' под названием' Load() 'и с' DbContext', для сравнения с явной загрузкой выше используется 'Load' в конце вместо' Execute'. 'Load' - метод' void' и автоматически заполняет дочернюю коллекцию. Но похоже, что такой «Load» не существует в EF 4.0, и вам нужно прикрепить результат, возвращенный 'Execute' вручную. Спасибо за примечание! (+1, для вопроса :)) – Slauma

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