Отключить ленивую загрузку по умолчанию в 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 по этой конкретной ссылке.