0

У меня есть веб-сайт Asp.net MVC, в котором я использую структуру сущностей в своем хранилище данных для доступа к базе данных (с объектами POCO).Entity framework: Любая причина, по которой моя связанная сущность не «лениво загружена»?

Я не знаю почему, но иногда это выглядит как ленивая загрузка только не сделали:

пример кода не работает:

using(BusinessEntities context = new BusinessEntities()){ 
    User user = context.Users.First(u=>u.Id == parameterId); 
    foreach(Post post in user.Posts){//user.Posts is null here and thrown an exception 
     //.. doing some things 
    } 
} 

Но если я это сделаю, то perfeclty работает

using(BusinessEntities context = new BusinessEntities()){ 
    User user = context.Users.Include("Posts").First(u=>u.Id == parameterId); 
    foreach(Post post in user.Posts){//user.Posts is null here and thrown an exception 
     //.. doing some things 
    } 
} 

Но я не понимаю, почему ленивая загрузка не работает:

  • контекст не расположен
  • Это не объект проекта анонима или что-то подобное
  • Я знаю, что есть много мест в моем коде, где я не должен указать это .INCLUDE и делать относительные работы
  • Я отложенной загрузки Enabled установлено значение Правда на моей EDMX модели

Что может приводит к такому поведению?

+0

Вы уверены, что находитесь на EF4, а не 3? –

+0

Является ли 'Должности' объявленными как' virtual'? – Eranga

+0

@WiktorZychla: Да, я уверен, POCO недоступны с EF3 – J4N

ответ

1

Объявить Posts собственности как virtual так, что прокси-объект, созданный EF может ленивые нагружает propety.

0

Пожалуйста, установите EF 4.1 с http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=8363, чтобы остановить использование магических строк внутри Include.

using System.Data.Entity; 

к вашим заявлениям использования.

Затем написать следующий запрос:

using(BusinessEntities context = new BusinessEntities()){ 
    var user = context.Users.Include(p=>p.Posts).FirstOrDefault(u=>u.Id == parameterId); 
    if(user != null) 
    { 
     foreach(Post post in user.Posts) 
     { 
     //.. do something 
     } 
    } 
} 

Для получения дополнительной информации обратитесь к следующему http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx

+0

Это не то, что я хочу, укажите, что я «Include» работают, но ленивая загрузка должна иметь возможность загружать отношение «Сообщений», не указывая Include (и что с EF 4.1 или без него) – J4N

+0

Я знаю, что я просто хотел сказать вам, что вы можете опустить Include со строкой и использовать общий. Для ленивой загрузки я бы не использовал ее, так как в большинстве случаев это вызывает проблемы с выбором N + 1. –

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