调试实体框架 SQL 语句

Posted

技术标签:

【中文标题】调试实体框架 SQL 语句【英文标题】:Debugging Entity Framework SQL statements 【发布时间】:2011-12-15 15:40:59 【问题描述】:

在使用实体框架进行 SQL 通信时,我的响应时间很奇怪。

这是来自我的虚拟主机:

这是来自我的本地服务器:

我担心的是响应时间的增加。 我已将问题缩小到代码中的一行 Nop.Data > EfRepository.cs > public void Insert(T entity) > _entities.Add(entity); 是的,我知道这对于 NopCommerce 来说非常具体,但重点是我正在向她寻求有关如何调试的帮助。

是否有一些我可以捕捉到的显示正在执行的 SQL 的事件? 或者我还能做些什么来了解更多在上述命令中实体框架中实际发生的事情。

【问题讨论】:

【参考方案1】:

对于调试 EF 查询,最简单的方法是将查询强制转换为 ObjectQuery 并使用 ToTraceString:

var query = myContext.MyTable
    .Where(r => r.Id == searchId)
    .Select(r => r);

Console.WriteLine(((ObjectQuery)query).ToTraceString());

这将显示查询的底层 SQL,并且您可以手动运行查询以调试它们缓慢的原因。这是 MSDN 链接:

http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx

如果您试图获取在您的上下文中调用 SaveChanges() 时运行的 SQL,这并不容易。你可以看看 EFTracingProvider:

http://blogs.msdn.com/b/jkowalski/archive/2009/06/11/tracing-and-caching-in-entity-framework-available-on-msdn-code-gallery.aspx

或者,假设您使用 SQL Server,您可以直接进入 SQL Profiler 并捕获 T-SQL 语句(这是我的首选方法)。

【讨论】:

谢谢,我会尝试第一个,因为 SaveChanges() 调用似乎不需要那么多时间,至少我写的那行花了很多时间。由于主机的限制,我不能不使用 Profiler(我试过)。 我发现部分问题出在关于将对象转换为特定类的代码中。所以问题可能与 SQL 无关【参考方案2】:

在 EF6 中,您也可以在 dbcontext 的构造函数中执行此操作

例子

public BookServiceContext() : base("name=BookServiceContext")

    // New code:
    this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

这会将 EF 生成的每个 SQL 查询记录到控制台。有关更多信息,请参阅本文http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/

【讨论】:

以上是关于调试实体框架 SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章

如果不支持包含,您如何在 LINQ to Entities(实体框架)中执行 SQL 样式的“IN”语句?

为啥实体框架不能在 LINQ 语句中使用 ToString()?

Mybatis 调试输出SQL语句,到底是如何实现的呢?

如何更改实体框架项目以使用 Microsoft SQL Server

代码优先实体框架或 NHibernate

实体框架 DbContext 执行的日志查询