Lazy loading w Entity Framework

Koncepcję lazy loading w platformach ORM opisałem we wpisie Lazy loading i eager loading. W tym wpisie pokażę przykłady użycia lazy loading w Entity Framework. Pokażę również jakie zapytania są wysyłane do bazy danych. W przykładach będę używał konfiguracji z PostgreSQL, którą opisałem we wpisie: Entity Framework i Postgresql.

W przykładach będziemy używać struktury bazy danych pokazanej na poniższym rysunku:

BookAuthorAssociation

Składa się ona z dwóch tabel Author i Book. Relacja między tymi tabelami to jeden do wielu, czyli jeden autor może być przypisany do wielu książek.

Konfiguracja Entity Framework

W przykładach użyjemy bazy danych PostgreSQL, dla innych baz danych konfigurację trzeba odpowiednio zmodyfikować.

Tworzymy bazę danych i aplikację konsolową, dodajemy biblioteki Npgsql i Entity Framework – szczegóły jak to zrobić są we wpisie: Entity Framework i PostgreSQL.

Tworzymy następujące klasy:

Do funkcji Main() w pliku Program.cs dodaj następujący kod:

Linia 1 wyłącza automatyczne generowanie i aktualizowanie schematu bazy danych – Npgsql nie wspiera tej funkcjonalności.

Pozostałe linie wypełniają nam tablice przykładowymi danymi i na zakończenie czyszczą bazę danych.

Przykłady należy wstawiać w miejsce komentarza ‘Examples here’

Możemy teraz przejść do przykładów.

Przykłady użycia lazy loading w Entity Framework

Lazy loading jest w Entity Frameworku w podstawowej konfiguracji włączony.

Uwaga! To że jest włączony nie oznacza jeszcze, że zostanie użyty, klasy POCO, które mapują tabele muszą spełniać pewne wymagania opisane tutaj. Jest to o tyle istotne, że zajęło mi kilka godzin znalezienie, że brakuje mi jednego ‘public’ w klasie…

Do funkcji Main() dodaj następujący kod:

Pobieramy listę książek i dla każdej książki wyświetlamy jej tytuł i nazwisko autora (które jest przechowywane w innej tabeli).

Wynikiem będzie:

Zobaczmy jakie zapytania SQL zostały wykonane:

Widzimy, że zostały wykonane 3 zapytania:

  1. Pobranie listy wszystkich książek z tabeli “book”
  2. Pobranie danych pierwszego autora
  3. Pobranie danych drugiego autora

Pobieranie danych autorów odbywa się w momencie odwołania się do book.Author.Name, pobrane dane są przechowywane w kontekście, więc dla każdego autora będzie wykonane jedno zapytanie do bazy danych. Sumaryczna liczba wywołań będzie, więc wynosiła 1 + liczba autorów, co w przypadku rzeczywistego systemu może wygenerować tysiące dodatkowych zapytań.

Rozważmy drugi przykład, odwrotny do poprzedniego, czyli pobieramy listę autorów i wyświetlamy dla każdego listę książek, które napisał. Dodaj następujący kod:

W wyniku wyświetli nam się następująca lista:

Zobaczmy jakie zapytania zostały wysłane do bazy danych:

Zostały wykonane 3 zapytania:

  1. Pobranie listy wszystkich autorów.
  2. Pobranie listy wszystkich książek pierwszego autora.
  3. Pobranie listy wszystkich książek drugiego autora.

Zasada działanie jest dokładnie taka sama jak w przypadku pierwszego przykładu.

 

Podsumowanie

Używanie lazy laoding w Entity Framework nie wymaga żadnych dodatkowych zabiegów – jest to zachowanie domyśle i jest używane automatycznie. Warunkiem jest tylko poprawne skonstruowanie obiektów POCO – tak jak jest to opisane tutaj.


Comments are closed.