2008-09-24 21 views

Respuesta

39

Usted puede poner algo como esto en su app.config archivo/web.config:

en el nodo configSections:

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

en el nodo de configuración:

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

Y no se olvide de llamar al

log4net.Config.XmlConfigurator.Configure(); 

en el inicio de la aplicación, o para poner

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

en los AssemblyInfo.cs

En los ajustes de configuración, establezca la propiedad "show_sql" true.

+0

Encontré que el SQL se registró en el nivel DEBUG, por lo que es posible que desee asegurarse de que su nivel de registrador es DEPURAR. – stimms

+0

¡corrección hecha! – mathieu

+0

Mi objetivo final es leer SQL de NHibernate, ver [aquí otra publicación] (http://stackoverflow.com/questions/8244083/how-to-read-sql-generated-by-nhibernate-in-visual-studio) – freeflying

6

Utilice el servidor de perfil sql.

EDITAR (1 año más tarde): Como @Toran Billups afirma a continuación, el perfilador de NHibernate Ayende escribió que es muy genial.

+0

Sí mucho más fácil que vadear MB de archivos de registro. –

16

En la configuración, configure la propiedad "show_sql" en verdadero. Esto hará que el SQL salga en archivos de registro de NHibernate cortesía de log4net.

+0

Agradable. Me olvide de eso. * haga clic en * –

+0

¿Por qué no es esta la respuesta aceptada? :) Gracias por el consejo. –

+0

Esto no muestra SQL completo para mí. No veo valores reales, algo como esto: 'SELECT application0_.ApplicationId como aplicación === App1_101_1_, application0_.ApplicationNumberCounty como ApplicationNu2_101_1 ...' –

5

También puedes probar NHibernate Profiler (prueba de 30 días si nada más). Esta herramienta es la mejor en mi humilde opinión.

Esto no sólo mostrará el SQL generado, sino también advertencias/sugerencias/etc

+0

Deffo - +1. ¡No existía cuando se hizo esta pregunta! –

+0

No funciona con SQL CE (a pesar de que se anuncia como tal), solo FYI –

1

Si está utilizando SQL Server (no urgente), se puede tratar de SQL Server.

5

Estoy un poco tarde, lo sé, pero este es el truco y es herramienta/db/framework independiente. En lugar de esas opciones válidas, uso NH Interceptors.

Al principio, implementar una clase que se extiende NHibernate.EmptyInterceptor e implementa 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); 
     } 
    } 
} 

A continuación, sólo tiene que pasar una instancia cuando se abre la sesión. Asegúrese de hacerlo solo cuando en DEBUG:

public static void OpenSession() { 

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

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

#endif 
} 

Y eso es todo.

A partir de ahora, sus comandos sql como estos ...

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

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

.. se muestran directamente en la ventana de salida:

NH: selecto elenco (count (*) como INT) como col_0_0_ de mensajes post0_

NH: seleccione post0_.Id como Id3_, post0_.user_id como user2_3_, post0_.Title como Title3_, post0_.Slug como Slug3_, post0_.Content como Content3_, post0_.created_at como created6_3_, post0_.updated_at como updated7_3_, post0_.deleted_at como deleted8_3_ de mensajes post0_ ordenar por post0_.created_at desc limit? compensar ?

Cuestiones relacionadas