在IDbCommandInterceptor中捕获调用方法名称

时间:2016-06-27 07:33:36

标签: c# entity-framework method-names

我使用IDbCommandInterceptor来捕获实体框架查询。通过这种方式,我可以访问一些重要信息,例如DbParameterDbCommand等。

我还需要调用此查询的位置。我尝试使用StackTrace

来解决此问题
StackTrace stackTrace = new StackTrace();
System.Reflection.MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();

这可能适用于常规方法调用,但在这种情况下,因为我拦截了实体框架机制,所以我不认为可以在我的代码中获取调用方法。

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

1 个答案:

答案 0 :(得分: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都会对性能造成巨大影响。在将其用于任何生产环境之前,请务必进行正确的测试。