有没有办法将SQL语句引用到生成SQL的C#EF代码?

时间:2016-02-12 02:52:51

标签: sql .net sql-server entity-framework debugging

当我对仅使用存储过程的大型.NET应用程序进行故障排除时,我从SQL Server Profiler捕获包含SP名称的sql,然后很容易在源文件中对SP进行全局搜索并找到确切的结果产生SQL的行。

使用Entity Framework时,由于动态创建SQL语句,因此无法实现。但是有时我会从生产中捕获一些有问题的sql语句,并想知道它们是从代码中生成的。

我知道可以根据需要生成EF生成日志和跟踪。这可能会对繁忙的服务器造成负担并产生太多日志。我读了一些关于使用迷你探查器的东西,但不确定它是否符合我的需要,因为我无法访问生产服务器。但是我有权将SQL Server Profiler附加到数据库服务器。

我的想法是找到一种方法让EF附加/注入一个唯一的代码到生成的SQL,但它不会影响SQL的结果。然后我可以使用它将它引用到将它注入SQL的代码行。唯一代码是静态的,这意味着每个EF linq语句都使用唯一的静态代码。也许作为一个虚拟sql或一个注释与sql语句一起发送。 我知道这会增加一些额外的流量,但就我而言,它会增加额外的灵活性并减少大量的故障排除时间。

关于如何做到这一点或任何替代方案的任何想法?

1 个答案:

答案 0 :(得分:0)

一种非常简单的方法是通过ExecuteStoreCommand()执行某些操作:Refresh data from stored procedure。我不确定你是否可以“执行”一个评论,但至少你应该能够做到这样的事情:

ExecuteStoreCommand("DECLARE @MyTag VARCHAR(100) = 'some_unique_id';");

这很简单,但您必须分两步找到关联:

  1. 从SQL Server Profiler
  2. 中执行效果不佳的查询中获取SessionID(即SPID)
  3. 在Profiler条目中搜索相同SPID的先前SQL语句
  4. 另一个可能稍微复杂的选项,但是在进行关联时会删除额外的步骤是在命令执行之前“拦截”命令并使用您的唯一ID注入注释。请参阅以下S.O.回答细节。你不应该完全不需要他们所做的,但即使你这样做,似乎所有的代码(或所有相关的东西)都在那里:

    Adding a query hint when calling Table-Valued Function

    顺便说一下,这种情况有利于使用存储过程而不是ORM。而且,一旦找到有问题的应用程序代码,您希望能够在性能调优方面做些什么? (另一点赞成使用存储过程而不是ORM; - )。