Entity Framework - в чем разница между включением / активной загрузкой и отложенной загрузкой?

Я пытался ознакомиться с Entity Framework. Большая часть этого кажется простой, но я немного запутался в разнице между энергичной загрузкой с помощью метода Include и отложенной загрузкой по умолчанию. Кажется, что оба загружают связанные объекты, поэтому на первый взгляд кажется, что они делают одно и то же. Чего мне не хватает?

18
задан Major Productions 17 August 2010 в 17:27
поделиться

2 ответа

Допустим, у вас есть две сущности с отношением «один-ко-многим»: «Клиент» и «Заказ», где у каждого клиента может быть несколько заказов.

При загрузке сущности «Клиент» Entity Framework позволяет загружать коллекцию «Заказы клиента» либо в ускоренном, либо в отложенном режиме. Если вы выберете активную загрузку коллекции Orders, при извлечении клиента из базы данных Entity Framework сгенерирует SQL, который извлекает как информацию о клиенте, так и заказы клиента в одном запросе.Однако, если вы выберете ленивую загрузку коллекции Orders, при извлечении клиента из базы данных Entity Framework будет генерировать SQL, который только извлекает информацию о клиенте (Entity Framework затем сгенерирует отдельный оператор SQL, если вы доступ к коллекции заказов клиентов позже в вашем коде).

Определение того, когда использовать активную загрузку, а когда - отложенную загрузку, сводится к тому, что вы ожидаете делать с объектами, которые вы извлекаете. Если вы знаете, что вам нужна только информация о клиенте, вам следует отложить загрузку коллекции заказов (чтобы SQL-запрос мог быть эффективным, только извлекая информацию о клиенте). И наоборот, если вы знаете, что вам нужно пройти через заказы клиента, вам следует с нетерпением загрузить заказы (так вы сэкономите лишнее обращение к базе данных, как только вы получите доступ к заказам клиента в своем коде).

P.S. Будьте очень осторожны при использовании отложенной загрузки, так как это может привести к проблеме N + 1. Например, предположим, что у вас есть страница, на которой отображается список клиентов и их заказов. Однако вы решили использовать отложенную загрузку при получении заказов. Когда вы перебираете коллекцию клиентов, а затем все заказы клиентов, вы выполняете обращение к базе данных для каждого клиента, чтобы выполнить отложенную загрузку в своей коллекции заказов. Это означает, что для N клиентов у вас будет N + 1 попадание в базу данных (1 попадание в базу данных для загрузки всех клиентов, затем N попаданий в базу данных для загрузки каждого из их заказов) вместо всего 1 попадания в базу данных, если бы вы использовали активную загрузку (что позволило бы получить всех клиентов и их заказы в одном запросе).

30
ответ дан 30 November 2019 в 06:17
поделиться

Активная загрузка предназначена для решения проблемы N + 1 Selects , характерной для ORM. Краткая версия такова: если вы собираетесь напрямую получить некоторое количество сущностей и знаете, что будете получать доступ к определенным связанным сущностям через извлеченные сущности, намного более эффективно извлекать все связанные сущности вверх. -front за один проход, по сравнению с их постепенным извлечением с помощью отложенной загрузки.

6
ответ дан 30 November 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: