¿Cómo configurar Fluent NHibernate para generar consultas para Rastrear o Depurar en lugar de la consola?


¿Cómo configurar Fluent NHibernate para generar consultas para Rastrear o Depurar en lugar de la consola? Estoy usando MsSqlConfiguration.MsSql2008.ShowSql() pero no tiene parámetros y no puedo encontrar nada en Google.

Author: André Pena, 2010-01-25

3 answers

Puedo ver en los foros y publicaciones de blog en todas partes que muchos otros antes que yo han buscado una manera de obtener las sentencias SQL mientras se preparan para su ejecución. La respuesta típicamente es algo en las líneas de" no puedes", o"no deberías".

Si debería o no, eso es lo que quería.

Después de horas de búsqueda, investigación e intentos fallidos, y finalmente se me ocurrió esto.

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

Por supuesto, usted no tiene que Trace.WriteLine() aquí, puede escribirlo en un archivo de registro, o cualquier otra cosa que necesite.

En tu gestor de conexiones, conecta tu Interceptor de la siguiente manera:

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

No es tan complicado. Desde mi perspectiva, sin duda es más fácil que tratar de obtener todo este XML empujado a través de Fluent a NHibernate, ya que Fluent abstrae el archivo XML.

Tenga en cuenta que solo puede tener un solo Interceptor, por lo que es posible que deba integrar esta función con su Interceptor existente, si ya tengo uno. En ese sentido, es posible que desee darle un nombre más amplio-por ejemplo, MyAppInterceptor, para no implicar un propósito específico, porque es posible que desee agregar otras características a él más adelante.

¡Espero que esto sea útil para alguien más! :-)

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-20 15:11:45

Probablemente quiera usar log4net, no ShowSql. Aquí hay una configuración para enviar consultas a Depurar:

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

Y luego llama a esto desde tu código antes de abrir una sesión de NHibernate:

log4net.Config.XmlConfigurator.Configure();

Cuando agregue una referencia a la DLL de log4net, asegúrese de establecer su propiedad "Copy Local" en "true".

Esto no es específico de FluentNHibernate, funciona igual en cualquier variante de 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-25 19:34:30

No he probado esto con SQL Server, pero con SQLite, el siguiente código mostrará SQL generado en la ventana Output (Menú de depuración -> Windows -> Output, en VS2008).

El cuadro combinado "Mostrar salida de:" en la ventana de salida debe configurarse en "Depurar" - VS2008 hizo eso por mí automáticamente.

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

Una advertencia: activar esto puede ralentizar considerablemente la ejecución.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-26 15:52:58