Отключить отложенную загрузку по умолчанию в Entity Framework 4 - PullRequest
60 голосов
/ 03 июня 2010

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

dataContext.ContextOptions.LazyLoadingEnabled

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

dataContext.ContextOptions.LazyLoadingEnabled = false;

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

Ответы [ 5 ]

67 голосов
/ 03 июня 2010

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

61 голосов
/ 03 октября 2011

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

public BlogContext()
{
    this.Configuration.LazyLoadingEnabled = false;
}
24 голосов
/ 25 марта 2013

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

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

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

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

23 голосов
/ 30 мая 2013

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

4 голосов
/ 07 июля 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...