Entity Framework i śledzenie wykonywanych zapytań SQL

Promuj

Ostatnio interesowało mnie jakie właściwie zapytania SQL generuje Entity Framework. Chwila na Google i znalazłem Entity Framework Profiler. Najnowszą wersję można pobrać z tego miejsca. Użycie tego narzędzia jest banalnie proste. Najpierw musimy dodać referencję do biblioteki HibernatingRhinos.Profiler.Appender.dll. Następnie gdzieś w punkcie startowym aplikacji umieścić takie polecenie:

HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize();

I to wszystko jeśli chodzi o konfigurację. Wszystkie wykonywane zapytania będziemy mogli śledzić w aplikacji graficznej. Przykładowo mając taką metodę:

public IList<Hero> GetHeroes()
{
return this.heroRepository.All().ToList();
}

Metoda (użyty został tutaj wzorzec Repository z poprzedniego posta) zwraca listę wszystkich bohaterów. Po wykonaniu tej metody w EF Profiler zobaczymy coś takiego:

Mamy, więc to co chcieliśmy – zapytanie SQL jakie jest wykonywane na bazie danych.

Niestety EF Profiler nie jest narzędziem darmowym. Skorzystałem tutaj z 30 dniowej wersji trial. W bardziej zaawansowane możliwości narzędzia nie wgłębiałem się zbytnio ponieważ interesował mnie tylko podgląd zapytań SQL.

Na szczęście istnieje darmowy projekt EF Provider Wrappers. Do dyspozycji mamy dwóch dostawców:

  • EFTracingProvider – dostawca umożliwiający podgląd wykonywanych zapytań,
  • EFCachingProvider – dostawca umożliwiający cachowanie wyników zapytań.

Ja skorzystałem oczywiście z tego pierwszego. W tym wpisie blogowym znajduje się dobry tutorial omawiający użycie tych dostawców. Ja przedstawię tutaj tylko krótki poradnik jak uruchomić dostawcę EFTracingProvider.

  1. Ściągamy projekt dostawców, a następnie go kompilujemy,
  2. Dodajemy referencję bibliotek EFTracingProvider.dll oraz EFProviderWrapperToolkit.dll do naszego projektu.
  3. Odnajdujemy plik ExtendedNorthwindEntities.cs (znajduje się on w projekcie EFProviderWrapperDemo) i kopiujemy do naszego projektu. Następnie przerabiamy go tak, żeby korzystał z naszej klasy ObjectContext oraz odpowiedniego connection string,
  4. Dodajemy do pliku konfiguracyjnego app.config następujący wpis:
    <system.data>
    <DbProviderFactories>
    <add name="EF Tracing Data Provider"
    invariant="EFTracingProvider"
    description="Tracing Provider Wrapper"
    type="EFTracingProvider.EFTracingProviderFactory, EFTracingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
    <add name="EF Generic Provider Wrapper"
    invariant="EFProviderWrapper"
    description="Generic Provider Wrapper"
    type="EFProviderWrapperToolkit.EFProviderWrapperFactory, EFProviderWrapperToolkit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
    </DbProviderFactories>
    </system.data>
    
  5. Wybieramy sposób logowania. Ja wybrałem wypisywanie zapytań SQL na konsole (kod ten należy umieścić gdzieś na starcie aplikacji):

    EFTracingProviderConfiguration.LogToConsole = true;

Po takiej konfiguracji wykonywane zapytania SQL będziemy mogli śledzić z poziomu Visual Studio w okienku Output. Dla metody GetHeroes przedstawionej wcześniej zostanie nam wyświetlone coś takiego:

Jest to dokładnie to samo zapytanie, które widzieliśmy wcześniej w EF Profiler.

Śledzenie wykonywanych zapytań SQL podczas działania aplikacji jest ważne. Pozwoli to nam na bieżąco monitorować w jaki sposób dane są wyciągane z bazy danych. W razie potrzeby będziemy mogli zmienić sposób ich pobierania na bardziej optymalny.

3 Responses to Entity Framework i śledzenie wykonywanych zapytań SQL

  1. Pingback: dotnetomaniak.pl

  2. reVis pisze:

    Warto dodać, że oprócz EFProf istnieje również NHProf dla NHibernate i L2SProf dla Linq2Sql również od Hibernating Rhinos.

  3. Michał pisze:

    Można również skorzystać z SQL Server Profiler.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s