Отключить ленивую загрузку по умолчанию в Entity Framework 4

Кажется, что в EF4 по умолчанию включена ленивая загрузка. По крайней мере, в моем проекте я вижу, что значение

dataContext.ContextOptions.LazyLoadingEnabled

истинно по умолчанию. Мне не нужна ленивая загрузка, и я не хочу писать:

dataContext.ContextOptions.LazyLoadingEnabled = false;

каждый раз, когда я получаю новый контекст. Так есть способ отключить его по умолчанию, скажем, по всему проекту?

Ответ 1

Следующий ответ относится к рабочему процессу Database-First или Model-First (только два рабочих процесса, которые были доступны с Entity Framework (версия <= 4.0), когда вопрос был задан). Если вы используете Code-First рабочий процесс (который доступен с версии EF >= 4.1), перейдите к ssmith answer к этому вопросу для правильного решение.


Файл edmx имеет в определении <ConceptualModel> и <EntityContainer> атрибут для ленивой загрузки, где вы можете установить ленивую загрузку в целом на false:

<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false">

В конструкторе ObjectContext создается следующий параметр:

public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext")
{
    this.ContextOptions.LazyLoadingEnabled = false;
    OnContextCreated();
}

Мой пример не означает, что сгенерированный ObjectContext (или DbContext в новых версиях EF) должен быть отредактирован вручную (который будет заменен каждым обновлением модели из базы данных, как отметил ctorx), но это элемент EntityContainer в разделе edmx:ConceptualModels файла EDMX следует отредактировать, добавив атрибут annotation:LazyLoadingEnabled="false" - либо вручную в редакторе XML, либо на странице свойств поверхности конструктора, где этот параметр также доступен. Эта модификация файла EDMX автоматически генерирует класс контекста с отключенной ленивой загрузкой в ​​конструкторе, как показано выше. Сама модификация файла EDMX не перезаписывается, когда модель обновляется из базы данных.

Ответ 2

Я написал быстрый пример, показывающий как новые функции Lazy Loading работают с EF Code First. Достижение того, что вы хотите в первой модели кода, - это просто вопрос о добавлении одной строки в конструктор DbContext, например:

public BlogContext()
{
    this.Configuration.LazyLoadingEnabled = false;
}

Ответ 3

Если вы, возможно, используете EF4 Code First, да? Итак, в Инициализации вашего контекста есть переопределение "OnModelCreated".

В этом методе я просто вызвал и установил свойство, и все было разрешено.

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
     base.Configuration.LazyLoadingEnabled = false;
}

Моя модель теперь гораздо приятнее. Ленивая загрузка велик... но не тогда, когда вы этого не хотите. И когда вы начинаете иметь круговые ссылки, это просто смешно.

Ответ 4

Вы также можете сделать это от дизайнера. Просто откройте файл .edmx, щелкните правой кнопкой мыши в любом месте модели и выберите "Свойства". Затем установите для параметра LazyLoadingEnabled значение false. введите описание изображения здесь

Ответ 5

Если вы сначала моделируете код, просто удалите ключевое слово virtual в свойствах ссылки/объекта. Наличие виртуального по ссылке позволит LazyLoading по этой конкретной ссылке.