2010-11-16 26 views
3

我有一个使用Entity Framework查询SQL Server数据库的Web应用程序。我希望能够以编程方式知道在数据库上执行了多少个查询(往返)。这个想法是记录这些信息,以便轻松检测出没有包含关系并导致大量往返行程的错误。如何监控数据库往返运行

有没有办法做到这一点?我不介意解决方案是否特定于SQL Server。

注:我要监控的数据库编程,因此工具,如SQL Server事件探查器是对我没有用。我希望能够在请求结束时和处理请求的代码中知道该请求执行了多少个查询。

+0

SQL Server Profiler是我的第一个想法。如果您看到数据库看到的请求,与EF提交的内容有关系吗? – 2010-11-16 17:19:02

+0

谢谢,但我需要一个可以包含在我的代码中的编程解决方案。请参阅我的编辑了解更多详情。 – 2010-11-16 17:31:06

回答

1

您可以使用SQL连接的provider statistics feature

+0

这很有趣。你有什么想法我可以如何使用它从实体框架?我想我需要捕捉连接的创建和处理,但我不知道如何去做。 – 2010-11-16 19:17:37

+0

好的,我发现它,我会尝试使用ObjectContext.Connection属性。我会用我的结果更新这个问题。 – 2010-11-16 19:20:52

+0

如果您愿意,您可以自己创建连接。 – 2010-11-16 19:23:31

1

也许用EFProf

+1

对于efprof +1,只要它具有“研究”许可 – 2010-11-16 17:32:42

+0

EFProf的编程访问看起来很复杂,不适合在Web应用程序中使用。 – 2010-11-16 18:51:01

0

我这样做了使用SQL Server 2008 Profiler的难题,如果你在profiler中设置了正确的过滤器,你将只能看到EF所做的调用。

+0

谢谢,但我需要一个可以包含在我的代码中的编程解决方案。请参阅我的编辑了解更多详情。 – 2010-11-16 17:34:21

1

一对夫妇的想法:

  • 如果使用T4模板来生成你的实体环境中,你可以改变生成的代码提供任何你想要的日志记录信息或。
  • 如果你使用LinqPad连接到你的dll,你可以运行你想要的任何方法,LinqPad将捕获SQL选项卡中的查询。
+0

我正在使用edmx文件的默认代码生成器。我可以定制它吗? – 2010-11-16 17:34:01

+1

@Antoine Aubry:请参阅这篇文章,了解如何使用T4模板:(http://blogs.msdn.com/b/efdesign/archive/2009/01/22/customizing-entity-classes-with-t4。 ASPX)。它不会更改edmx文件,而是从edmx生成的.cs文件。 – StriplingWarrior 2010-11-16 19:02:24

2

这是我最终的解决方案,基于Craig Stuntz的建议。

using(var database = new MyEntities()) 
{ 
    SqlConnection sqlConnection = null; 

    var entityConnection = _database.Connection as EntityConnection; 
    if (entityConnection != null) 
    { 
     sqlConnection = entityConnection.StoreConnection as SqlConnection; 

     // Enable statistics 
     sqlConnection.StatisticsEnabled = true; 
    } 

    // Access the database 

    if (sqlConnection != null) 
    { 
     var statistics = sqlConnection.RetrieveStatistics(); 
     var selectCount = (long)statistics["SelectCount"]; 

     // Do something with the statistics 
    } 
}