Меня интересует запись имени метода, инициировавшего запрос Entity Framework. Я буду использовать эту функциональность как в Entity Framework 6, так и в Entity Framework Core.
Рассмотрим следующий класс:
namespace MyCompany.MyApp
{
public class MyDataClass
{
// ... snip ...
public Person GetPerson(long id)
{
return _dbContext
.Person
.FirstOrDefault(p => p.Id == id);
}
}
}
И следующий перехватчик:
public class EFCommandInterceptor : IDbCommandInterceptor
{
// ... snip other interface methods ...
public void ReaderExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)
{
var callingMehtod = GetCallingMethod() // <--- I'd like this to return the string "MyCompany.MyApp.MyDataClass.GetPerson"
}
}
Is есть ли способ определить, какой метод инициировал запрос, в результате которого был вызван перехватчик?
Поскольку я собираюсь использовать эту функцию для отслеживания и анализа производительности, я не могу отправить и записать все Environment.StackTrace
для каждого запроса, проходящего через систему.
Я также рассматривал возможность использования класса StackTrace
в сочетании с stackTrace.GetFrames()
, чтобы попытаться проанализировать стек вызовов, чтобы найти фактический метод, инициировавший запрос, но он не ясно, как сделать это надежно, не полагаясь на какое-то соглашение о пространстве имен, которое универсально идентифицирует класс доступа к данным.
Другой приемлемый подход может выглядеть примерно так:
namespace MyCompany.MyApp
{
public class MyDataClass
{
// ... snip ...
public Person GetPerson(long id)
{
return _dbContext
.Person
.WithExtraInterceptorContext(new { CallingMethod = "MyCompany.MyApp.MyDataClass.GetPerson"}) // <--- Can something like this be done?
.FirstOrDefault(p => p.Id == id);
}
}
}
намерение с приведенным выше примером сможет позже получить дополнительный контекст через DbCommandInterceptionContext
внутри IDbCommandInterceptor
В конечном итоге проблема, которую я пытаюсь решить, состоит в том, чтобы получить полное имя метода, инициировавшего запрос, без полного стека вызовов.