Как посмотреть SQL, сгенерированный nHibernate? - PullRequest
38 голосов
/ 24 сентября 2008

Как посмотреть SQL, сгенерированный nHibernate? версия 1.2

Ответы [ 8 ]

42 голосов
/ 25 сентября 2008

Вы можете поместить что-то подобное в ваш файл app.config / web.config:

в узле configSections:

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>

в узле конфигурации:

<log4net>
  <appender name="NHibernateFileLog" type="log4net.Appender.FileAppender">
    <file value="logs/nhibernate.txt" />
    <appendToFile value="false" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n"  />
    </layout>
  </appender>
  <logger name="NHibernate.SQL" additivity="false">
    <level value="DEBUG"/>
    <appender-ref ref="NHibernateFileLog"/>
  </logger>
</log4net>

И не забудьте позвонить

log4net.Config.XmlConfigurator.Configure();

при запуске приложения или поставить

[assembly: log4net.Config.XmlConfigurator(Watch=true)]

в сборкеinfo.cs

В настройках конфигурации установите для свойства show_sql значение true.

17 голосов
/ 24 сентября 2008

В настройках конфигурации установите для свойства show_sql значение true. Это приведет к выводу SQL в лог-файлы NHibernate благодаря log4net.

7 голосов
/ 20 апреля 2016

Я немного опоздал, я знаю, но это помогает, и это не зависит от инструмента / базы данных / фреймворка. Вместо этих допустимых опций я использую NH Interceptors .

Сначала реализуем класс, который расширяет NHibernate.EmptyInterceptor и реализует NHibernate.IInterceptor :

using NHibernate;

namespace WebApplication2.Infrastructure
{
    public class SQLDebugOutput : EmptyInterceptor, IInterceptor
    {
        public override NHibernate.SqlCommand.SqlString
           OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
        {
            System.Diagnostics.Debug.WriteLine("NH: " + sql);

            return base.OnPrepareStatement(sql);
        }
    }
}

Тогда просто передайте экземпляр при открытии сеанса. Обязательно делайте это только в режиме DEBUG:

public static void OpenSession() {

#if DEBUG
    HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession(new SQLDebugOutput());

#else
    HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession();

#endif
}

И это все.

С этого момента ваши команды sql, подобные этим ...

 var totalPostsCount = Database.Session.Query<Post>().Count();

 var currentPostPage = Database.Session.Query<Post>()
        .OrderByDescending(c => c.CreatedAt)
        .Skip((page - 1) * PostsPerPage)
        .Take(PostsPerPage)
        .ToList();

.. отображаются прямо в окне вывода:

NH: выберите приведение (количество (*) как INT) как col_0_0_ из сообщений post0_

NH: выберите post0_.Id как Id3_, post0_.user_id как user2_3_, post0_.Title as Title3_, post0_.Slug as Slug3_, post0_.Content as Content3_, post0_.created_at как созданный 6_3_, post0_.updated_at как обновленный 7_3_, post0_.deleted_at as Удалено8_3_ из сообщений post0_ упорядочить по post0_.created_at desc limit? смещение?

6 голосов
/ 24 сентября 2008

Использовать профилировщик сервера sql.

РЕДАКТИРОВАТЬ (1 год спустя): как пишет @Toran Billups ниже, профайлер NHibernate Айенде очень круто написал.

5 голосов
/ 12 октября 2009

Вы также можете попробовать NHibernate Profiler (30-дневная пробная версия, если ничего больше). Этот инструмент лучший ИМХО.

Это покажет не только сгенерированный SQL, но и предупреждения / предложения / etc

3 голосов
/ 24 сентября 2008

Хорошая справка для ведения журнала NHibernate: Как настроить Log4Net для использования с NHibernate . Он включает в себя информацию о регистрации всех сгенерированных операторов NHibernate.

1 голос
/ 31 июля 2014

Если вы используете SQL Server (не Express), вы можете попробовать SQL Server Profiler.

1 голос
/ 12 октября 2009

Nhibernate Profiler - вариант, если вам нужно что-то серьезное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...