2014-02-06 1 views
7

Мы используем Dapper и EF в нашем магазине, а Dapper - очень полезны при отладке запросов на SQL-сервере, когда что-то пошло не так. Вместо того, чтобы просто подачи сырой SQL, мы создали тонкий декоратор, который также добавляет некоторый контекст информации (происхождение) как SQL комментарий, что-то вродеВвести отладочную информацию в запросы Entity Framework

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

Это позволяет нашим АБД и разработчикам очень быстро reacy и найти источник проблемы, если у нас есть вызовы БД, которые являются ошибочными, или вводят хиты производительности (у нас есть сотни тысяч вызовов БД в день, поэтому один плохой запрос может нанести некоторый ущерб).

Мы также хотели бы сделать это с помощью EF. Это не обязательно должен быть комментарий SQL, но какой-то крючок для доставки метаинформации, которая отправляется с вызовом. Любая идея, возможно ли это?

Спасибо за ваши советы

Philipp

+0

я только обнаружил, что EF 6 обеспечивает лучший перехват capabilitie (HTTP: // MSDN .microsoft.com/EN-US/журнал/dn532202.aspx). Я не смог поиграть с ним, но, возможно, успею в ближайшем будущем и отчитается здесь. –

ответ

4

Оказывается, это становится очень легко с EF 6. Все, что нужно, это реализация IDbCommandInterceptor, что позволило мне дополнить представленный SQL с обычаем (SQL). Этот комментарий появится в журналах базы данных и, таким образом, включит отладку/трассировку со стороны DBA.

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) 
    { 
    } 
} 

Для того, чтобы получить выше перехватчик работает, я просто зарегистрировал его со статическим DbInterception класса:

DbInterception.Add(new DebugCommentInterceptor());