Entity Framework: как отключить ленивую загрузку для определенного запроса?


88

Есть ли способ отключить ленивую загрузку для определенного запроса на Entity Framework 6? Я хочу использовать его регулярно, но иногда хочу отключить. Я использую виртуальные свойства для их ленивой загрузки.


20
установить context.Configuration.LazyLoadingEnabled = false; перед запросом, который вы хотите запустить
Картик Ганесан

5
Вы могли бы просто установить значение this.Configuration.LazyLoadingEnabled = false;, а затем установить его снова this.Configuration.LazyLoadingEnabled = true;? Кроме того, вы можете прочитать это msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388

1
спасибо @KarthikGanesan. Это сработало, как и ожидалось.
Марко Алвес,

@KarthikGanesan Не могли бы вы поставить свой комментарий в качестве ответа? Это действительно хорошо работает :)
Sampath

1
Добавлен комментарий как ответ @Sampath
Karthik Ганесан

Ответы:


76

установите следующий код перед запросом, который вы хотите выполнить

context.Configuration.LazyLoadingEnabled = false;

40

Вы можете отключить отложенную загрузку для определенного запроса следующим образом:

public static Cursos GetDatosCursoById(int cursoId)
{
    using (var bd = new AcademyEntities())
    {
        try
        {
            bd.Configuration.ProxyCreationEnabled = false;
            return bd.Cursos.FirstOrDefault(c => c.cursoId == cursoId);
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}

20

Возможно, мне здесь что-то не хватает, но вместо того, чтобы каждый раз менять конфигурацию, можно было бы использовать другой подход .Include()только для тех запросов, которые вы хотите загрузить?

Предположим, у нас есть Productкласс, у которого есть свойство навигации для Colourкласса, вы можете загрузить Colourего Productпримерно так:

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();

1
Для меня это лучший ответ!
Ян

Этого недостаточно, если вы хотите загружать только «продукты» без каких-либо включений.
Mackan 01

Итак, вы хотите получить «Продукты» без каких-либо связанных с ними объектов или «Продукты со всеми связанными с ними объектами»?
Parrybird 01

1
Намного более полезный ответ. Это контролирует конкретные подчиненные таблицы, которые загружаются в точке, где создается запрос. Для решения любой реальной проблемы это должно быть подходящим решением.
Ричард Петерам 02

5
Это полезно по-другому ... если вы сделаете это таким образом, вы все равно можете получить ленивую загрузку для другой коллекции из 'Products'. На самом деле отключение отложенной загрузки более эффективно, чтобы гарантировать, что все необходимые данные будут получены заранее, и избежать создания скрытых узких мест в производительности.
Дуг

15

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

Если вы сначала используете код, перейдите в область конфигурации и отключите его оттуда с помощью:

this.Configuration.LazyLoadingEnabled = false;

6
Многие люди посещают этот вопрос, и я хочу сказать, что люди НЕ ПИШИТЕ ЗАПРОСЫ, НЕ ВЗГЛЯД НА ПЛАН ВЫПОЛНЕНИЯ. Всегда знайте, что ваш код отправляет в базу данных, иначе у вас возникнут проблемы с производительностью. Вы можете использовать linq pad или другие инструменты для просмотра реального запроса и проверки.
Хуан


3

Еще один подход для другой версии EF (Entity Framework 5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 

Когда context- это ObjectContextболее или менее устаревший предшественник своей оболочки DbContext.
Герт Арнольд,

2

Предположим, у вас есть это:

IOrderedQueryable<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite);
}

У вас все равно будет отложенная загрузка, несмотря на явную настройку not to. Исправить легко, измените его на это:

List<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    // context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite).ToList();
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.