Entity Framework: Jak wyłączyć leniwe ładowanie dla określonego zapytania?

88

Czy istnieje sposób wyłączenia leniwego ładowania dla określonego zapytania w Entity Framework 6? Chcę go używać regularnie, ale czasami chcę go wyłączyć. Używam właściwości wirtualnych, aby je ładować z opóźnieniem.

Marco Alves
źródło
20
ustaw context.Configuration.LazyLoadingEnabled = false; przed zapytaniem, które chcesz uruchomić
Karthik Ganesan
5
Możesz po prostu ustawić wartość this.Configuration.LazyLoadingEnabled = false;, a następnie ustawić ją ponownie this.Configuration.LazyLoadingEnabled = true;? Możesz również przeczytać ten msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388,
1
dziękuję @KarthikGanesan. Działało zgodnie z oczekiwaniami.
Marco Alves,
@KarthikGanesan Czy możesz zamieścić swój komentarz jako odpowiedź? Działa naprawdę dobrze :)
Sampath
1
Dodano komentarz jako odpowiedź @Sampath
Karthik Ganesan

Odpowiedzi:

76

ustaw następujący kod przed zapytaniem, które chcesz wykonać

context.Configuration.LazyLoadingEnabled = false;
Karthik Ganesan
źródło
40

Możesz wyłączyć leniwe ładowanie dla określonego zapytania w następujący sposób:

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;
        }
    }
}
William Ballesteros
źródło
20

Być może czegoś tutaj brakuje, ale zamiast zmieniać konfigurację za każdym razem, czy innym podejściem może być użycie .Include()tylko tych zapytań, w których chcesz chętnie ładować?

Załóżmy, że mamy Productklasę, która ma właściwość nawigacji do Colourklasy, możesz załadować Colourdla Productczegoś takiego -

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();
Parrybird
źródło
1
Dla mnie to najlepsza odpowiedź tutaj!
Ian
To nie wystarczy, jeśli chcesz tylko chętnie ładować „produkty” bez żadnych dołączeń.
Mackan
Chcesz więc otrzymać „Produkty” bez żadnych powiązanych obiektów lub „Produkty ze wszystkimi powiązanymi z nimi obiektami”?
Parrybird
1
O wiele bardziej przydatna odpowiedź. To steruje określonymi tabelami podrzędnymi, które są ładowane w punkcie, w którym konstruowane jest zapytanie. W przypadku każdego rzeczywistego problemu musi to być droga.
Richard Petheram,
5
Przydaje się w inny sposób ... jeśli zrobisz to w ten sposób, możesz nadal leniwie ładować kolejną kolekcję z „Produkty”. W rzeczywistości wyłączenie leniwego ładowania jest skuteczniejsze, ponieważ gwarantuje, że wszystkie potrzebne dane są pobierane z wyprzedzeniem i pozwala uniknąć tworzenia ukrytych wąskich gardeł wydajności.
Doug
15

Przejdź do właściwości diagramu i znajdź właściwość wyznaczoną do leniwego ładowania i wyłącz ją.

Jeśli używasz najpierw kodu, przejdź do obszaru konfiguracji i wyłącz go stamtąd za pomocą:

this.Configuration.LazyLoadingEnabled = false;
Juan
źródło
6
Wiele osób odwiedza to pytanie i chcę powiedzieć, że ludzie NIE PISUJĄ PYTAŃ BEZ ZAPOZNANIA SIĘ Z PLANEM WYKONANIA. Zawsze wiesz, jaki kod wysyła do bazy danych, inaczej będziesz mieć problemy z wydajnością. Możesz użyć linq pad lub innych narzędzi, aby wyświetlić prawdziwe zapytanie i sprawdzić.
Juan
3

Inne podejście do innej wersji EF (Entity Framework 5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 
fubo
źródło
Gdy contextjest to ObjectContext, bardziej lub mniej wycofanego poprzednika zapakowane, DbContext.
Gert Arnold
2

Załóżmy, że masz to:

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

Wciąż ładowałbyś się leniwie, pomimo wyraźnego ustawienia nie. Poprawka jest łatwa, zmień to na:

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();
}
Twierdza
źródło