Entity Framework: Як вимкнути ліниве завантаження для конкретного запиту?


88

Чи є спосіб вимкнути ліниве завантаження для конкретного запиту на Entity Framework 6? Я хочу використовувати його регулярно, але іноді хочу відключити. Я використовую віртуальні властивості, щоб ліниво їх завантажувати.


20
встановити context.Configuration.LazyLoadingEnabled = false; перед запитом, який ви хочете виконати
Karthik Ganesan

5
Ви можете просто встановити значення this.Configuration.LazyLoadingEnabled = false;, а потім встановити його знову this.Configuration.LazyLoadingEnabled = true;? Також ви можете прочитати це msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388

1
дякую @KarthikGanesan. Це спрацювало, як очікувалося.
Марко Алвес

@KarthikGanesan Чи можете ви залишити свій коментар як відповідь? Це працює дуже добре :)
Сампат

1
Додав коментар як відповідь @Sampath
Karthik Ganesan

Відповіді:


76

встановіть наступний код перед запитом, який потрібно виконати

context.Configuration.LazyLoadingEnabled = false;

40

Ви можете вимкнути Lazy завантаження для конкретного запиту наступним чином:

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
Для мене це найкраща відповідь тут!
Ян

Це не вдається, якщо ви бажаєте лише завантажувати "продукти", без будь-яких включень.
Маккан

Отже, ви хочете отримати "Продукти" без будь-яких пов'язаних з ними об'єктів або "Продукти з усіма пов'язаними з ними об'єктами?"
Parrybird

1
Набагато корисніша відповідь. Це керує конкретними таблицями підпорядковань, які завантажуються в точці побудови запиту. Для будь-якої реальної світової проблеми це має бути правильним шляхом.
Richard Petheram,

5
Це корисно по-іншому ... якщо ви зробите це таким чином, ви все одно можете отримати ліниве завантаження для іншої колекції з "Продукти". Насправді вимкнення лінивого завантаження є більш ефективним, щоб гарантувати, що всі необхідні дані отримуються заздалегідь і уникає створення прихованих вузьких місць у роботі.
Даг,

15

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

Якщо ви спочатку використовуєте код, перейдіть до області налаштування та вимкніть його звідти за допомогою:

this.Configuration.LazyLoadingEnabled = false;

6
Багато людей відвідують це питання, і я хочу сказати, люди НЕ ПИШУТЬ ЗАПИТАННЯ, НЕ ПЕРЕГЛЯНУЧИ ПЛАН ВИКОНАННЯ. Завжди знайте, що ваш код надсилає в базу даних, інакше у вас будуть проблеми з продуктивністю. Ви можете використовувати панель linq або інші інструменти для перегляду реального запиту та перевірки.
Хуан


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);
}

Ви все одно отримаєте ліниве завантаження, незважаючи на чітке налаштування не робити. Виправити це легко, змініть його на таке:

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.