Ответ 1
Если вы говорите о динамических прокси-серверах в EF, выделяются два разных типа:
- Прокси для ленивой загрузки
- Прокси для отслеживания изменений
Обычно прокси-сервер отслеживания изменений также может служить прокси-сервером для ленивой загрузки. Обратное неверно. Это связано с тем, что требования к прокси-серверам отслеживания выше, особенно все свойства - также скалярные свойства - должны быть virtual
. Для ленивой загрузки достаточно, чтобы свойства навигации были virtual
.
Тот факт, что прокси-сервер отслеживания изменений всегда позволяет использовать ленивую загрузку, является основной причиной, по которой DbContext имеет этот флаг конфигурации:
DbContext.Configuration.LazyLoadingEnabled
Этот флаг по умолчанию равен true. Установка его на false
отключает ленивую загрузку, даже если создаются прокси. Это особенно важно, если вы работаете с прокси-серверами отслеживания изменений, но не хотите использовать эти прокси-серверы для ленивой загрузки.
Опция...
DbContext.Configuration.ProxyCreationEnabled
... полностью отключает создание прокси - для отслеживания изменений и ленивой загрузки.
Оба флага имеют смысл вообще, если классы сущностей соответствуют требованиям для создания отслеживания изменений или ленивых прокси-серверов загрузки.
Теперь вы знаете цель динамических ленивых прокси-серверов. Итак, почему нужно использовать прокси-серверы динамического изменения?
Фактически единственной причиной, о которой я знаю, является производительность. Но это очень веская причина. Сравнение отслеживания изменений на основе моментального снимка с отслеживанием изменений на основе прокси-сервера отличается разницей в производительности - из моих измерений коэффициент 50-100 реалистичен (взято из метода, который необходим около часа для 10000 entites с отслеживанием изменений на основе моментальных снимков и от 30 до 60 секунд после того, как все свойства виртуальны, чтобы включить прокси-серверы отслеживания изменений). Это становится важным фактором, если у вас есть приложение, которое обрабатывает и изменяет многие (более 1000) объектов. В веб-приложении, где у вас есть только операции Create/Change/Delete для отдельных объектов в веб-запросе, эта разница не имеет большого значения.
Почти во всех ситуациях вы можете использовать загрузку с нетерпением или explicite для достижения той же цели, если вы не хотите работать с ленивыми загрузками. Производительность для простой загрузки на основе прокси-сервера или без прокси-сервера - это то же самое, потому что в основном тот же запрос возникает при загрузке свойств навигации - в первом случае прокси-сервер выполняет запрос, во втором - ваш ручной код. Таким образом, вы можете жить без ленивых загрузочных прокси, не теряя при этом много.
Но если вы хотите, чтобы разумная производительность для обработки многих и многих объектов не была альтернативой прокси-серверам отслеживания изменений, помимо использования EntityObject
производных объектов в EF 4.0 (не вариант в EF 4.1, поскольку это запрещено при использовании DbContext
) или вообще не использовать Entity Framework.
Изменить (май 2012)
Тем временем я узнал, что существуют ситуации, когда изменяет прокси-серверы отслеживания не быстрее или хуже в производительности по сравнению с отслеживанием на основе моментальных снимков.
Из-за этих осложнений при использовании прокси-серверов с отслеживанием изменений предпочтительным способом является использование отслеживания изменений на основе моментальных снимков по умолчанию и тщательное использование прокси (после выполнения некоторых тестов) только в ситуациях, когда требуется высокая производительность и где они оказываются более быстрыми чем отслеживание изменений на основе снимков.