Отладка SQL-операторов Entity Framework

У меня странная картина времени отклика при использовании Entity Framework для связи SQL.

Это с моего веб-хостинга:

введите описание изображения здесь

Это с моего локального сервера:

введите описание изображения здесь

Меня беспокоит увеличение времени отклика. Я сузил проблему до одной строки в коде Nop.Data > EfRepository.cs > public void Insert(T entity) > _entities.Add(entity); Да, я знаю, что это очень специфично для NopCommerce, но дело в том, что я ищу у нее помощи в том, как это отладить.

Есть ли какие-то события, которые я могу поймать, которые отображают выполнение SQL? Или что еще я могу сделать, чтобы узнать больше о том, что на самом деле происходит в Entity Framework в этой команде выше.


person Anders    schedule 26.10.2011    source источник


Ответы (2)


Для отладки запросов 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

Если вы пытаетесь получить SQL, который запускается при вызове SaveChanges() в вашем контексте, это не так просто. Вы можете взглянуть на 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 (это мой предпочтительный подход).

person JohnD    schedule 26.10.2011
comment
Спасибо, я попробую первый, потому что вызов SaveChanges(), кажется, не занимает так много времени, по крайней мере, строка, которую я написал, заняла много времени. Не могу не использовать Profiler (пробовал) из-за ограничений на хосте. - person Anders; 26.10.2011
comment
Я обнаружил, что часть проблемы заключалась в коде, касающемся приведения объектов к определенным классам. Так что проблема, вероятно, не была связана с SQL - person Anders; 17.11.2011

В EF6 вы также можете сделать это в конструкторе вашего dbcontext.

Пример

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

Это будет регистрировать в консоли каждый SQL-запрос, который генерирует EF. Дополнительную информацию см. в этой статье http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/

person Richie    schedule 24.04.2015