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.
- Ściągamy projekt dostawców, a następnie go kompilujemy,
- Dodajemy referencję bibliotek EFTracingProvider.dll oraz EFProviderWrapperToolkit.dll do naszego projektu.
- 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,
- 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>
- 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.
Entity Framework i śledzenie wykonywanych zapytań SQL « Damian Antonowicz…
Dziękujemy za publikację – Trackback z dotnetomaniak.pl…
Warto dodać, że oprócz EFProf istnieje również NHProf dla NHibernate i L2SProf dla Linq2Sql również od Hibernating Rhinos.
Można również skorzystać z SQL Server Profiler.