当我对仅使用存储过程的大型.NET应用程序进行故障排除时,我从SQL Server Profiler捕获包含SP名称的sql,然后很容易在源文件中对SP进行全局搜索并找到确切的结果产生SQL的行。
使用Entity Framework时,由于动态创建SQL语句,因此无法实现。但是有时我会从生产中捕获一些有问题的sql语句,并想知道它们是从代码中生成的。
我知道可以根据需要生成EF生成日志和跟踪。这可能会对繁忙的服务器造成负担并产生太多日志。我读了一些关于使用迷你探查器的东西,但不确定它是否符合我的需要,因为我无法访问生产服务器。但是我有权将SQL Server Profiler附加到数据库服务器。
我的想法是找到一种方法让EF附加/注入一个唯一的代码到生成的SQL,但它不会影响SQL的结果。然后我可以使用它将它引用到将它注入SQL的代码行。唯一代码是静态的,这意味着每个EF linq语句都使用唯一的静态代码。也许作为一个虚拟sql或一个注释与sql语句一起发送。 我知道这会增加一些额外的流量,但就我而言,它会增加额外的灵活性并减少大量的故障排除时间。
关于如何做到这一点或任何替代方案的任何想法?
答案 0 :(得分:0)
一种非常简单的方法是通过ExecuteStoreCommand()
执行某些操作:Refresh data from stored procedure。我不确定你是否可以“执行”一个评论,但至少你应该能够做到这样的事情:
ExecuteStoreCommand("DECLARE @MyTag VARCHAR(100) = 'some_unique_id';");
这很简单,但您必须分两步找到关联:
另一个可能稍微复杂的选项,但是在进行关联时会删除额外的步骤是在命令执行之前“拦截”命令并使用您的唯一ID注入注释。请参阅以下S.O.回答细节。你不应该完全不需要他们所做的,但即使你这样做,似乎所有的代码(或所有相关的东西)都在那里:
Adding a query hint when calling Table-Valued Function
顺便说一下,这种情况有利于使用存储过程而不是ORM。而且,一旦找到有问题的应用程序代码,您希望能够在性能调优方面做些什么? (另一点赞成使用存储过程而不是ORM; - )。