Как настроить Fluent NHibernate для вывода запросов на трассировку или отладку вместо консоли? - PullRequest
48 голосов
/ 25 января 2010

Как настроить Fluent NHibernate для вывода запросов на трассировку или отладку вместо консоли? Я использую MsSqlConfiguration.MsSql2008.ShowSql(), но у него нет параметров, и я ничего не могу найти в Google.

Ответы [ 3 ]

95 голосов
/ 25 марта 2011

Я вижу по сообщениям на форумах и в блогах повсюду, что многие другие до меня искали способ получить операторы SQL по мере их подготовки к выполнению. Ответом обычно является что-то вроде «вы не можете» или «вы не должны».

Должен ли я или нет, это то, что я хотел.

После нескольких часов поиска, расследования и неудачных попыток, и, наконец, я придумал это.

Запишите перехватчик:

using NHibernate;
using System.Diagnostics;

public class SqlStatementInterceptor : EmptyInterceptor
{
    public override NHibernate.SqlCommand.SqlString OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
    {
        Trace.WriteLine(sql.ToString());
        return sql;
    }
}

Конечно, вам не нужно Trace.WriteLine() здесь, вы можете записать его в файл журнала или что-то еще, что вам нужно.

В вашем менеджере соединений подключите ваш перехватчик так:

protected virtual void Configure(FluentConfiguration config)
{
    config.ExposeConfiguration(x =>
                                   {
                                       x.SetInterceptor(new SqlStatementInterceptor());
                                   });
}

Это не так сложно. С моей точки зрения, это гораздо проще, чем пытаться протолкнуть весь этот XML через Fluent в NHibernate - так как Fluent абстрагирует XML-файл.

Имейте в виду, у вас может быть только один перехватчик - поэтому вам может потребоваться интегрировать эту функцию с существующим перехватчиком, если он у вас уже есть. На этой ноте вы можете дать ей более широкое имя - например, MyAppInterceptor, чтобы не подразумевать конкретную цель, потому что вы можете захотеть добавить другие функции к нему позже.

Надеюсь, это поможет кому-то еще! : -)

33 голосов
/ 25 января 2010

Вы, вероятно, хотите использовать log4net, а не ShowSql. Вот некоторая конфигурация для отправки запросов в Debug:

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

  <log4net debug="false">
    <appender name="WindowsDebugOutput" type="log4net.Appender.DebugAppender,
         log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern"
              value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" />
      </layout>
    </appender>

    <logger name="NHibernate.SQL" additivity="false">
      <level value="DEBUG" />
      <appender-ref ref="WindowsDebugOutput" />
    </logger>
  </log4net>

А затем вызовите это из своего кода перед открытием сеанса NHibernate:

log4net.Config.XmlConfigurator.Configure();

Когда вы добавляете ссылку на log4net DLL, убедитесь, что для ее свойства «Copy Local» установлено значение «true».

Это не относится к FluentNHibernate, оно работает одинаково в любом варианте NHibernate.

11 голосов
/ 26 января 2010

Я не пробовал это с SQL Server, но с SQLite следующий код будет отображать сгенерированный SQL в окне Вывод (Меню отладки -> Windows -> Вывод, в VS2008).

Поле со списком «Вывод из:» в окне «Вывод» должно быть установлено на «Отладка» - VS2008 сделал это для меня автоматически.

            sessionFactory = Fluently.Configure()
                .Database(SQLiteConfiguration.Standard
                            .UsingFile(DbFile)
                            // Display generated SQL in Output window
                            .ShowSql()
                          )
                .Mappings(m => m.AutoMappings.Add( GetAutoPersistenceModel() ))
                .BuildSessionFactory()
                ;

Слово предупреждения - включение этого параметра может значительно замедлить выполнение.

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