2011-10-26 16 views
8

Mam dziwny wzorzec czasu odpowiedzi podczas korzystania z Entity Framework dla komunikacji SQL.Debugowanie instrukcji encji kodu Entity Framework

To z mojego hostingowego:

enter image description here

To z mojego lokalnego serwera:

enter image description here

To wzrost czasu reakcji Jestem zaniepokojony. Zawęziłem problem do pojedynczej linii w kodzie Nop.Data> EfRepository.cs> public void Insert (obiekt T)> _entities.Add (entity); Tak, wiem, że to bardzo specyficzne dla NopCommerce, ale chodzi o to, że szukam jej pomocy, jak to debugować.

Czy są jakieś zdarzenia, które można złapać, które wyświetlają wykonywanego SQL? Albo, co mogę zrobić, aby dowiedzieć się więcej o tym, co faktycznie dzieje się w Entity Framework w powyższym poleceniu.

Odpowiedz

21

Do debugowania zapytań EF, najłatwiej jest rzucić zapytanie do ObjectQuery i używać ToTraceString:

var query = myContext.MyTable 
    .Where(r => r.Id == searchId) 
    .Select(r => r); 

Console.WriteLine(((ObjectQuery)query).ToTraceString()); 

To pokaże bazowego SQL dla kwerendy, można uruchomić kwerendy ręcznie debugować dlaczego są powolne. Oto link MSDN:

http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx

Jeśli próbujesz uzyskać SQL, który jest uruchamiany, gdy dzwonisz SaveChanges() w swoim kontekście, to nie jest takie proste. Można spojrzeć na EFTracingProvider:

http://blogs.msdn.com/b/jkowalski/archive/2009/06/11/tracing-and-caching-in-entity-framework-available-on-msdn-code-gallery.aspx

Albo, przy założeniu korzystania z SQL Server, można przejść bezpośrednio do SQL Profiler i uchwycić T-SQL (to mój ulubiony sposób).

+0

Dzięki, wypróbuję pierwszą, ponieważ wywołanie SaveChanges() nie wydaje się zajmować tak dużo czasu, przynajmniej wiersz, który napisałem, zajął dużo czasu. Nie mogę nie używać Profiler (próbowałem) z powodu ograniczeń na hoście. – Anders

+0

Dowiedziałem się, że część problemu dotyczyła kodu dotyczącego rzutowania obiektów na określone klasy. Problem prawdopodobnie nie był związany z SQL – Anders

8

W EF6, można również zrobić to w konstruktorze swojej dbcontext

przykładu

public BookServiceContext() : base("name=BookServiceContext") 
{ 
    // New code: 
    this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 
} 

To będzie zalogować się do konsoli każde zapytanie SQL EF generuje. Więcej informacji znajduje się w tym artykule: http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/

Powiązane problemy