Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

В файле app.config/web.config можно добавить что-то вроде этого:

в configSections node:

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

в конфигурации node:

<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)]

в файле assemblyinfo.cs

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

Ответ 2

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

Ответ 3

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

EDIT (1 год спустя): Как утверждает @Toran Billups, профайлер NHibernate Айенде очень крут.

Ответ 4

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

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

Ответ 5

Я немного опоздал, знаю, но это трюк, и это инструмент /db/framework независим. Вместо этих допустимых вариантов я использую 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: выберите cast (count (*) как 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 как created6_3_, post0_.updated_at как обновленный7_3_, post0_.deleted_at как deleted8_3_ из сообщений post0_ order by post0_.created_at desc limit? смещение?

Ответ 7

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

Ответ 8

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