13

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

这是来自我的网络主机:

在此处输入图像描述

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

在此处输入图像描述

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

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

4

2 回答 2

26

对于调试 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 语句(这是我的首选方法)。

于 2011-10-26T11:22:49.880 回答
14

在 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/

于 2015-04-24T14:02:36.887 回答