2012-04-26 2 views
0

У меня есть довольно глубокий граф объектов и хотелось бы с нетерпением загрузить весь график.График объектно загружаемого объекта с кодом EF Сначала

Я знаю, что я могу с нетерпением загрузить определенные свойства навигации, используя .Include().

Однако это кажется хрупким (если добавить свойство навигации, я также должен добавить дополнительный .Include) и требует (в моем случае) довольно многих операторов .Include().

Есть ли способ проинструктировать EF с нетерпением загрузить весь граф объектов?

ответ

1

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

Однако, что кажется хрупким (если добавить свойство навигации, я должен также добавить дополнительный .INCLUDE) и требует (в моем случае) довольно много .INCLUDE() заявления.

Это менее хрупкий, чем автоматическое включение всего. Такая функция просто вызовет слишком много проблем, потому что во многих случаях она будет неожиданно загружать навигационные свойства загрузки.

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

Есть several proposed features для улучшения загрузки в EF. Вы можете пройти через них, вы можете увидеть ценность или предложить новую.

+0

Является ли это еще лучшим способом для загрузки всего графа объектов? Кто-нибудь из этих предлагаемых функций видел свет в день? –

0

Однако, это кажется хрупким (если добавить свойство навигации, я также должен добавить дополнительный .Include) и требует (в моем случае) довольно многих операторов .Include().

Для того чтобы держать весь код, чтобы загрузить графа объекта в одном месте, я создал метод расширения, который может быть использован в любом месте в коде

static public IQueryable<My> IncludeAll(this DbSet<My> parent) 
{ 
    var include = parent 
     .Include(p => p.CollA) 
     .Include(p => p.CollB) 
     .Include(p => p.CollC) 
     .Include(p => p.CollD) 
     .Include(p => p.CollE) 
     .Include(p => p.CollF) 
     .Include(p => p.Etc); 

    return include; 
} 

Использование

var query = ctx.Mys.IncludeAll().Where(...); 
Смежные вопросы