Jak skonfigurować płynne NHibernate do wysyłania zapytań do śledzenia lub debugowania zamiast konsoli?

Jak skonfigurować Fluent NHibernate do wysyłania zapytań do śledzenia lub debugowania zamiast konsoli? Używam MsSqlConfiguration.MsSql2008.ShowSql() ale nie ma parametrów i nie mogę nic znaleźć w Google.

Author: André Pena, 2010-01-25

3 answers

Widzę z postów na forum i blogu wszędzie, że wielu innych przede mną szukało sposobu na uzyskanie instrukcji SQL, ponieważ są one przygotowywane do wykonania. Zazwyczaj odpowiedź brzmi: "nie możesz" lub "nie powinieneś".

Czy powinienem, czy nie, tego właśnie chciałem. Po godzinach poszukiwań, śledztw i nieudanych próbach, w końcu wpadłem na to.

Napisz interceptor:

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;
    }
}

Oczywiście, że nie musisz Trace.WriteLine() Tutaj, możesz to zapisać do pliku dziennika, czy cokolwiek innego potrzebujesz.

W Menedżerze połączeń, podłącz swój Interceptor tak:

protected virtual void Configure(FluentConfiguration config)
{
    config.ExposeConfiguration(x =>
                                   {
                                       x.SetInterceptor(new SqlStatementInterceptor());
                                   });
}
To nie takie skomplikowane. Z mojego punktu widzenia na pewno łatwiejsze niż próba przepchnięcia całego tego XML przez Fluent do NHibernate - ponieważ Fluent abstrahuje plik XML.

Pamiętaj, że możesz mieć tylko jeden Interceptor - więc być może będziesz musiał zintegrować tę funkcję z istniejącym Intercept, jeśli już mam. MyAppInterceptor, aby nie sugerować konkretnego celu, ponieważ możesz później dodać do niego inne funkcje.

Mam nadzieję, że to pomoże komuś innemu! :-)
 96
Author: mindplay.dk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-20 15:11:45

Prawdopodobnie chcesz użyć log4net, a nie ShowSql. Oto kilka konfiguracji do wysyłania zapytań do debugowania:

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

A następnie wywołaj to z kodu przed otwarciem sesji NHibernate:

log4net.Config.XmlConfigurator.Configure();

Kiedy dodajesz odniesienie do biblioteki DLL log4net, upewnij się, że jej właściwość " Copy Local "ma wartość"true".

Nie jest to specyficzne dla FluentNHibernate, działa to samo w każdym wariancie NHibernate.

 33
Author: Michael Maddox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-25 19:34:30

Nie próbowałem tego z SQL Server, ale w SQLite następujący kod pokaże wygenerowany SQL w oknie Output (menu debugowania -> Windows - > Output, w VS2008).

Pole combo "Show output from:" W oknie Output powinno być ustawione na "Debug" - VS2008 zrobił to dla mnie automatycznie.

            sessionFactory = Fluently.Configure()
                .Database(SQLiteConfiguration.Standard
                            .UsingFile(DbFile)
                            // Display generated SQL in Output window
                            .ShowSql()
                          )
                .Mappings(m => m.AutoMappings.Add( GetAutoPersistenceModel() ))
                .BuildSessionFactory()
                ;
Słowo ostrzeżenia - włączenie tego może znacznie spowolnić egzekucję.
 11
Author: Tom Bushell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-26 15:52:58