Entity Framework - Когда он автоматически загружает ссылочные отношения? - PullRequest
1 голос
/ 08 января 2010

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

Например, если у меня есть таблица с именем Автомобиль и таблица с именем Колесо , и для каждого ряда автомобилей имеется 4 ряда колес, EF автоматически загрузит Колесо строк, когда я получаю доступ к myCar.Wheel , или общая практика - сначала вызвать myCar.Wheel.Load () ?

Ответы [ 3 ]

6 голосов
/ 08 января 2010

В EF 4 ленивая загрузка выполняется по умолчанию, если вы используете генерацию кода или прокси. «Чистые» POCO (не путать с так называемыми POCO-прокси) не могут выполнять ленивую загрузку, если вы не кодируете ее. Более подробная информация в этом сообщении .

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

Явная загрузка означает вызов Load(). Обычно вы тестируете IsLoaded перед вызовом Load().

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

Проекция заставляет EF генерировать SQL только для необходимых свойств оптимизированным способом.

Хотя отложенная загрузка по умолчанию включена в EF 4, она относительно неэффективна в любом ORM (вызывает много запросов к БД). Вы все еще можете использовать проекцию или активную загрузку вместо этого.

0 голосов
/ 08 января 2010

В Entity Framework версии 1 (он же 3.5) существует только три сценария, в которых EF может загружать данные из связанной таблицы:

  1. Вы явно присоединяетесь к этой таблице в своем запросе Linq
  2. Вы используете синтаксис Включить в запросе Linq (см. Включение Linq-To-Entities )
  3. Вы используете проекцию, как описано в ответе Крейга Стунца.

Все три сценария, описанные выше, требуют, чтобы вы явно указали, что вы хотите загрузить связанные данные таблицы. Насколько я знаю, EF v1 никогда не сделает это «за кулисами» без вашего запроса (что можно рассматривать как позитив, но это не то, как работают другие современные ORM, и они изменили его в версии 2 - версии 4.0).

0 голосов
/ 08 января 2010

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

if (!order.SalesOrderDetail.IsLoaded)
{
    order.SalesOrderDetail.Load();
}

Прямо из:

Как выполнить расширенную загрузку связанных объектов (Entity Framework)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...