Ленивая загрузка не работает для классов POCO в Entity Framework - PullRequest
1 голос
/ 19 января 2012

Пожалуйста, помогите мне, я новичок в EF. Кажется, что отложенная загрузка объектов POCO не работает.

  • Мои классы POCO находятся в отдельной сборке, отличной от той, что предназначена для доступа к данным (т. Е. DAL)
  • Уровень доступа к данным просто упаковывает вызовы, сделанные в контекст объекта EF. Пожалуйста, смотрите код ниже

    public FilterMaster GetFilter(long ID)
    {
        FilterMaster entity = new FilterMaster();
        try
        {
            using (var context = new RadarEntities())
            {                
                //context.ContextOptions.LazyLoadingEnabled = false;
                //context.ContextOptions.ProxyCreationEnabled = true;
                entity = context.FilterMasters.SingleOrDefault(filter => filter.ID == ID);
                //context.FilterMasters.Include(
                context.LoadProperty(entity, "SQLQuery");                   
    
            }
        }
    
    • Когда вызов DAL завершен, ObjectContext теряется, и когда я пытался извлечь связанные дочерние объекты класса Root POCO, я получаю нулевое значение.
    • Я попытался явно включить ProxyCreation, EnabledLazyLoading, проверил, что сгенерированные предложения прокси не запечатаны и все связанные свойства помечены как виртуальные (как предлагается в некоторых других ссылках). - Поскольку отложенная загрузка не работала, я подумал о том, чтобы охотно загрузить все связанные объекты POCO, поэтому попытался вызвать метод LoadProperty, который работает.

В1: Я что-то пропускаю, ленивая загрузка не работает?

Q2: Если я хочу просто загрузить все связанные дочерние объекты, вам придется вызывать метод LoadProperty для всех свойств, или есть более простой способ?

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Вы утилизируете свой ObjectContext. Это то, что мешает вам использовать LazyLoading. Если вам требуется LazyLoading, класс, содержащий GetFilter, должен создать ObjectContext при его создании, реализовать IDisposable и утилизировать ObjectContext при его удалении.

2 голосов
/ 19 января 2012

В1: Я что-то пропускаю, ленивая загрузка не работает?

Это работает, но в этом нет никакой магии - под вами создан прокси, который попытается получить значение свойства из базы данных для вас при первом доступе.

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

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

Q2: Если я хочу явно загрузить все связанные дочерние объекты, придется вызывать метод LoadProperty для всех свойств или там есть какой-нибудь более простой способ?

Да, вы можете указать запрос Include() для быстрого поиска свойств, в вашем случае это будет:

 entity = context.FilterMasters
                 .Include("SQLQuery")
                 .SingleOrDefault(filter => filter.ID == ID);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...