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();
Parrybird
источник
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();
}
Крепость
источник