it-swarm.com.ru

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

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

dataContext.ContextOptions.LazyLoadingEnabled

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

dataContext.ContextOptions.LazyLoadingEnabled = false;

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

59
Mike Chamberlain

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


Файл 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, а затем Свойства.

enter image description here

Эта модификация файла EDMX автоматически генерирует класс контекста с отключенной опцией отложенной загрузки в конструкторе, как показано выше. Само изменение файла EDMX не перезаписывается при обновлении модели из базы данных.

65
Slauma

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

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

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

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

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

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

24
beauXjames

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

23
Amin Saqi

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

4
Todd