调试实体框架SQL语句

And*_*ers 11 performance entity-framework nopcommerce

在使用Entity Framework进行SQL通信时,我有一种奇怪的响应时间模式.

这是来自我的网站主持人:

在此输入图像描述

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

在此输入图像描述

这是我担心的响应时间的增加.我已经将问题缩小到代码Nop.Data> EfRepository.cs> public void Insert(T entity)> _entities.Add(entity); 是的,我知道这对于NopCommerce非常具体,但关键在于我正在寻求她的帮助来解决这个问题.

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

Joh*_*hnD 22

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

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

Console.WriteLine(((ObjectQuery)query).ToTraceString());
Run Code Online (Sandbox Code Playgroud)

这将显示查询的基础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事件探查器并捕获T-SQL语句(这是我的首选方法).


小智 9

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

public BookServiceContext() : base("name=BookServiceContext")
{
    // New code:
    this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
}
Run Code Online (Sandbox Code Playgroud)

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