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.


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;

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

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

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;

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; 

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();
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.