在EF Code First中跟踪SQL查询

18

我正在使用Entity Framework Code First,并希望能够记录DbContext生成的所有SQL查询。在Linq to sql中,有一个DB日志,但在EF中似乎找不到它。然后我可以将它们放入日志或输出到页面。

我正在使用EntityFramework Assembly的4.1.0.0版本。


EF允许您传递连接(而不是字符串)吗?如果可以的话,我知道一些方法。 - Marc Gravell
(为了让这一点有上下文,我们在所有的stackoverflow代码中都进行这种追踪,并且我们不使用.Log) - Marc Gravell
Marc,你是否使用自定义连接实现来钩取日志记录? - Richard Forrest
是的 - 定制连接,命令,读取器等,并正在开源化的过程中。 - Marc Gravell
@Marc Gravel 请在你开源时告诉我,我会非常感激。 - Richard Forrest
有点晚了,但是关于我上面的评论:这就是miniprofiler:https://www.nuget.org/packages/MiniProfiler/ - 或者说:“ITmeze做对了”。 - Marc Gravell
4个回答

6
您最好使用Entity Framework Profiler,虽然它不是免费的。您也可以手动获取它将生成的SQL,方法是在IQueryable本身上运行ToString(),但这必须针对每个查询进行。最后一个选择是,如果您正在使用MS Sql Server作为后端,则可以加载Sql Server Profiler(我相信它随Sql Server Management Studio一起提供),并从那里记录sql语句。

1
如果OP决定购买这个分析器,他很幸运,因为创建者(Ayende)今天结婚并在6月1日之前提供29%的折扣。http://ayende.com/blog/8193/the-big-event-is-just-a-week-away - Mike
好吧,我现在可能不得不购买它了。100美元的折扣有点难以拒绝。 - KallDrexx
1
我了解性能分析工具。我想要一个代码内的解决方案,可以在MVC网页本身上输出结果。我不想每个查询都这样做,我希望在上下文中有一个事件可以让我捕获查询并记录它。 - Richard Forrest
@feanz - 这里我们使用的代码完全可以做到这一点;它允许我们在每个请求中实时、上下文地审查SQL。 - Marc Gravell

1

我就放在这里了。

public class Context : DbContext
{
    public Context(string connectionString) : base(connectionString)
    { Database.Log = Console.Write;  }
}

1

Miniprofiler 是一个免费的替代 Entity Framework Profiler 的工具,它可以让你跟踪 Web 请求期间执行的所有 SQL 查询。


0

随着EF等工具的出现,使用SQL Server Profiler变得比以往任何时候都更为重要。在这种情况下,SQL Server Profiler应该成为首选工具。如果在我们实际编写查询时它已经很重要了,那么现在这些工具为我们构建查询,使用它就更加必要了。不仅对于调试,还对于优化来说。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接