2014-02-06 5 views
7

Wir verwenden Dapper und EF in unserem Shop und Dapper erwies sich als äußerst hilfreich beim Debuggen von SQL Server-Abfragen, wenn etwas schief gelaufen ist. Anstatt nur rohe SQL einreichen, haben wir einen dünnen Dekorateur, der auch eine Kontextinformationen (der Ursprung) als SQL-Kommentar hinzufügt, so etwas wieDebuginformationen in Entity Framework-Abfragen einspeisen

/* Foo.Bar.GetOrders() */ SELECT * FROM Order WHERE orderId > 123 

Dieser unsere DBAs und Entwicklern ermöglicht, sehr schnell reacy und die Quelle finden eines Problems, wenn wir irrtümliche DB-Aufrufe haben oder Performance-Hits einführen (wir haben Hunderttausende von DB-Calls pro Tag, also kann eine schlechte Abfrage ziemlich viel Schaden anrichten).

Wir möchten das auch mit EF machen. Es muss kein SQL-Kommentar sein, sondern irgendeine Art von Hook, um Metainformationen zu liefern, die mit dem Aufruf übergeben werden. Irgendeine Idee, ob das möglich ist?

Vielen Dank für Ihre Beratung

Philipp

+0

ich gerade entdeckt, dass EF 6 besser Abfangen capabilitie bietet (http: // msdn .microsoft.com/de/us/magazin/dn532202.aspx). Ich habe damit nicht spielen können, aber vielleicht in naher Zukunft Zeit haben und würde hier zurück melden. –

Antwort

4

wird dies mit EF sehr einfach stellte sich heraus, 6. Alles, was benötigt wird ist eine Implementierung von IDbCommandInterceptor, die mir die eingereichten SQL mit einem benutzerdefinierten zu erweitern erlaubt (SQL) Kommentar. Dieser Kommentar wird in den Datenbankprotokollen angezeigt und aktiviert somit das Debugging/Tracing von der DBA-Seite.

public class DebugCommentInterceptor : IDbCommandInterceptor 
{ 
    public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) 
    { 
     command.CommandText = "/* TRACING INFORMATION GOES HERE */ " + command.CommandText; 
    } 

    public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) 
    { 
     command.CommandText = "/* TRACING INFORMATION GOES HERE */ " + command.CommandText; 
    } 

    public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) 
    { 
    } 

    public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) 
    { 
    } 

    public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext) 
    { 
    } 

    public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext) 
    { 
    } 
} 

Um die oben Interceptor in Betrieb, ich registriert sie einfach mit der statischen DbInterception Klasse:

DbInterception.Add(new DebugCommentInterceptor());