Узнайте, какой код запускает Entity Framework SQL-код

Я начал использовать некоторые профилировщики Entity Framework, такие как ANTS и некоторые другие подобные альтернативы. После анализа профилировщика он перечисляет все узкие места Entity Framework в формате запросов SQL, созданных Entity Framework. Но я не могу отследить, какой запрос в коде. Можно ли узнать, какая строка кода выполняет этот SQL-запрос?

1 ответ

Я не думаю, что вы можете заставить ANTS сделать это (только Redgate может).

Но во время профилирования или без него вы всегда можете зарегистрировать все операторы SQL, прикрепив Action к свойству Database.Log контекста.

В этом действии регистрации вы также можете записать трассировку стека в этот момент, а затем попытаться найти обнаруженные узкие места SQL в журнале отладки:

using (var db = new MyContext())
{
    db.Database.Log = s =>
    {
        Debug.WriteLine(s);
        if (s.StartsWith("SELECT"))
            Debug.WriteLine("\nStack trace:\n" +
                string.Join("", new StackTrace(3).GetFrames().ToList()));
    };
    // LINQ statements here.
}

Некоторые комментарии

  • я использую new StackTrace(3) пропустить первые несколько кадров, которые охватывают сам процесс регистрации. Где-то внизу трассировки стека вы найдете метод C#, который запустил записанный оператор SQL.
  • Это только журнал трассировки стека для SELECT команды. Обычно это те, которые вы хотите проанализировать.

Это хорошая идея, чтобы получить ваши экземпляры контекста из фабрики контекста, чтобы вы могли написать этот код регистрации только один раз. Вы можете добавить действие регистрации условно if DEBUG директива компилятора.

Другие вопросы по тегам