2012-05-19 4 views
2

Я читаю книгу Programming Entity Framework: DbContext, и я только что прочитал главу о типах загрузки три данных:Entity сравнения база данных стратегия загрузки

  • отложенной загрузки (по умолчанию)
  • жадная загрузка
  • Явная загрузка

Теперь я спрашиваю себя, какая загрузка данных лучше в какой ситуации. Конкретное сравнение было бы неплохо! Я их не нашел.

Например, я использую по умолчанию ленивую загрузку для модуля для клиента. Этот модуль имеет дело с торговыми представителями и подразумевающие эти связанные таблицы:

  • Репс
  • Reps_Zones
  • Reps_Prerequisites
  • Пользователи
  • Reps_Languages ​​
  • т.д.

На модуле, Я использую все эти таблицы для отправки встреч (около 150 назначений на 50 повторений за раз), но он медленный. Будет ли использование другой стратегии загрузки действительно улучшить производительность?

+0

Yeah Lazy loading не лучшее решение здесь. В принципе у вас проблема с N + 1. Означает, что каждый раз, когда вы обращаетесь к сущности, он запускает инструкцию select для загрузки только этого объекта. Представьте себе цикл через кучу объектов. Здесь много вопросов. Лучше загружать загрузку или я предполагаю, что явная загрузка, что вам понадобится, с помощью построителей запросов или linq. – Gohn67

+0

См. Здесь о проблеме N + 1 с ленивой загрузкой в ​​orm http://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem – Gohn67

ответ

2

Lazy-loading кажется наиболее подходящим для небольших приложений без отдельных слоев данных. Когда приложение растет, и вы начинаете разделять его на отдельные слои, ленивая загрузка становится менее полезной. DBcontext уже давно был уничтожен к тому времени, когда данные попадают на уровень пользовательского интерфейса, и пока вы находитесь в составе datalayer, не стоит указывать правильность загрузки.

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

Lazy loading также делает отладку довольно сложной, так как запрос не выполняется до тех пор, пока он не будет использован, поэтому вы не сможете легко проверить результаты запроса. Я обычно добавляю ToList() или аналогично моим EF-запросам, поэтому я могу легко изучить результаты.