studio - ¿Cómo veo el SQL generado por nHibernate?
nhibernate visual studio 2017 (8)
En la configuración, configure la propiedad "show_sql" en verdadero. Esto hará que el SQL salga en los archivos de registro de NHibernate cortesía de log4net.
¿Cómo veo el SQL generado por nHibernate? versión 1.2
Hay una buena referencia para el registro NHibernate en: Cómo configurar Log4Net para usar con NHibernate . Incluye información sobre el registro de todas las sentencias SQL generadas por NHibernate.
También puede probar NHibernate Profiler (prueba de 30 días si nada más). Esta herramienta es la mejor en mi humilde opinión.
Esto no solo mostrará el SQL generado sino también advertencias / sugerencias / etc.
Nhibernate Profiler es una opción, si tiene que hacer algo serio.
Utilice el analizador de servidor sql.
EDITAR (1 año después): como dice @Toran Billups a continuación, el perfilador de NHibernate Ayende es muy genial.
Puede poner algo como esto en su archivo app.config / 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 te olvides de llamar
log4net.Config.XmlConfigurator.Configure();
al inicio de su aplicación, o para poner
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
en el assemblyinfo.cs
En la configuración, configure la propiedad "show_sql" en verdadero.
Si está utilizando SQL Server (no Express), puede probar SQL Server Profiler.
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, implemente una clase que amplíe NHibernate.EmptyInterceptor e implemente 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);
}
}
}
Luego, solo pase una instancia cuando abra su sesión. Asegúrese de hacerlo solo cuando esté en DEPURACIÓN:
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.
A partir de ahora, tus 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 su ventana de Salida:
NH: selecciona el reparto (cuenta (*) como INT) como col_0_0_ de las publicaciones post0_
NH: seleccione post0_.Id como Id3_, post0_.user_id como user2_3_, post0_.Title como Title3_, post0_.Slug como Slug3_, post0_.Contenido como Content3_, post0_.created_at como created6_3_, post0_.updated_at como updated7_3_, post0_.deleted_at como deleted8_3_ de publicaciones post0_ orden por post0_.created_at desc límite? compensar ?