Измерение времени для каждого запроса Entity Framework - PullRequest
2 голосов
/ 25 сентября 2019

Чтобы измерить и отладить время для каждого запроса в Entity Framework 6.3, я реализовал DbCommandInterceptor согласно принятому ответу на связанный вопрос:

public class EFLogger : IDbCommandInterceptor
{
    public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        startMeasuring(command, interceptionContext);
    }

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

DbInterception.Add(new EFLogger());

Этоработает нормально, вызывается до и после отправки каждой команды в базу данных, и я могу измерить время, которое потребовалось.

Однако он измеряет только время до инициализации SqlDataReader.Большую часть времени для каждого запроса тратят, пока SqlDataReader повторяется и потребляется.Я хочу выяснить, сколько времени это занимает для каждого запроса, в идеале без добавления кода секундомера для каждого оператора.

Могу ли я каким-либо образом перехватить, когда закрывается SqlDataReader или читается 'финальная' запись?

Я понимаю, что SqlDataReader не всегда может быть использован полностью, поэтому окончательную запись может быть трудно обнаружить.На данный момент меня интересуют только случаи, когда SqlDataReader повторяется до конца.

Кажется, что интерфейс IDbCommandInterceptor не предоставляет никаких событий для этого.

Есть ли другой механизм для захвата момента, когда считыватель закрыт?

Или я мог бы внедрить пользовательскую оболочку DbDataReader в код Entity Framework?Или есть альтернативный подход со стороны SQL Server?

...