Чтобы измерить и отладить время для каждого запроса в 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?