2

IDbCommandInterceptor用来捕获实体框架查询。这样我可以访问一些关键信息,例如DbParametersDbCommand等。

但我还需要获取调用此查询的位置。我试图通过使用来获得这个StackTrace

StackTrace stackTrace = new StackTrace();
System.Reflection.MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();

这可能适用于常规方法调用,但在这种情况下,由于我正在拦截实体框架机制,因此我看不到在我的代码中获取调用方法是可能的。

实体框架查询运行时是否可以自动获取调用方法名称?

4

1 回答 1

0

有点晚了,但你在正确的轨道上。

检查https://github.com/aspnet/EntityFramework6/issues/657,它将解释如何从 CallStack 获取信息。

只是该链接的复制/粘贴:

var stack = new StackTrace(true);
command.CommandText += "\r\n\r\n/********************* \r\n * "
    + string.Join("\r\n * ",
    (from f in stack.GetFrames().Skip(2)
        let m = f.GetMethod()
        select m?.DeclaringType.Name + "." + m?.Name + ":" + f.GetFileLineNumber())
    ) + "\r\n*********************/";

缺点是在每个数据库交互上调用 StackTrace 都会对性能造成巨大影响。在将其放入任何生产环境之前,请务必进行适当的测试。

于 2019-06-20T08:17:46.110 回答