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


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

dataContext.ContextOptions.LazyLoadingEnabled

значение true по умолчанию. Я не хочу ленивой загрузки и не хочу писать:

dataContext.ContextOptions.LazyLoadingEnabled = false;

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

5 56

5 ответов:

следующий ответ относится к Database-First или Модель-Первый рабочий процесс (только два рабочих процесса, которые были доступны с Entity Framework (версия Code-First рабочий процесс (который доступен с версии EF >= 4.1) перейдите к ssmith's ответ к этому вопросу для правильного решения.


файл 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 не перезаписывается при обновлении модели из базы данных.

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

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

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

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

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

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

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

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