在 IDbCommandInterceptor 中捕获调用方法名称

2024-05-14

我在用IDbCommandInterceptor捕获实体框架查询。这样我就可以访问一些重要信息,例如DbParameters and DbCommand etc.

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

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

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

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


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

check https://github.com/aspnet/EntityFramework6/issues/657 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 都会对性能造成巨大影响。在将其放入任何生产环境之前,请务必进行正确的测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 IDbCommandInterceptor 中捕获调用方法名称 的相关文章

随机推荐