2016-08-05 6 views
2

Предположим, что у меня есть таблицы, как =Почему Entity Framework загружается связанные объекты автоматически

  1. Пользователи (ID, Имя пользователя, электронная почта, пароль)
  2. User_Profile (ID, UserID_FK, Имя, Фамилия, отчество)

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

db.Users.Include(x=>x.User_Profile).Where(z=>z.ID==1).ToList()

Но в моем проекте, даже если я использую

db.Users.Where(z=>z.ID==1).ToList()

Я до сих пор в состоянии получить связанные объекты. Почему это происходит?

+1

Ленивая загрузка включена? –

+0

Как я могу узнать? – kamalpreet

+3

вы можете проверить его через конфигурацию контекста, например 'Context.Configuration.LazyLoadingEnabled'. Вы можете отключить ленивую загрузку для всех объектов, установив значение в false: 'Context.Configuration.LazyLoadingEnabled = false;' –

ответ

2

Чтобы ответить на ваш вопрос, вам нужно понять основные идеи, лежащие в основе Lazy Loading and Eager loading в EF.

Нетерпеливо Загрузка:

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

db.Users.Include(x=>x.User_Profile).Where(z=>z.ID==1).ToList() 

Ленивая Загрузка:

Отложенной загрузка представляет собой процесс, посредством которого лицо или совокупность лиц автоматически загружаются из базы данных в первый раз, что свойство со ссылкой на лицо/лица получает доступ. При использовании типов сущностей POCO ленивая загрузка достигается путем создания экземпляров производных прокси-типов, а затем переопределения виртуальных свойств для добавления загрузочного крючка. Например, при использовании класса сущности пользователя, определенного в вашем коде, связанный Профиль/с будет загружен при первом доступе к свойствам доступа Proflie/s.

Отключение отложенной загрузки для конкретных навигационных свойств

  • Ленивой загрузки коллекции сообщений может быть выключено, сделав свойство сообщений невиртуальным.

Выключите отложенной загрузки для всех объектов:

public class MyDbContext: DbContext 
{ 
    public MyDbContext:() 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
    } 
} 

Явная загрузка:

Явная загрузка определяется как: когда объекты возвращаются запросом, связанные объекты не являются загружается одновременно. По умолчанию они не загружаются до явного запроса с использованием метода Load в свойствах навигации.

Ресурсы:

https://msdn.microsoft.com/en-us/data/jj574232.aspx

+0

Итак, это означает, что в Lazy Loading, если мы не пытаемся получить доступ к свойствам навигации, записи не извлекаются, не так ли? – kamalpreet

+0

@kamalpreet исправляет также, когда VS-отладчик будет загружать их при доступе к ним. динамический прокси (виртуальный прокси) может доставлять пустые объекты до тех пор, пока запрос не будет завершен. Дополнительная информация: https://msdn.microsoft.com/en-us/data/jj592886.aspx –

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