web-dev-qa-db-fra.com

Comment visualiser le SQL généré par nHibernate?

Comment visualiser le SQL généré par nHibernate? version 1.2

42
Larry Foulkrod

Vous pouvez mettre quelque chose comme ça dans votre fichier app.config/web.config:

dans le nœud configSections:

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

dans le nœud de configuration:

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

Et n'oubliez pas d'appeler

log4net.Config.XmlConfigurator.Configure();

au démarrage de votre application, ou pour mettre

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

dans le assemblyinfo.cs

Dans les paramètres de configuration, définissez la propriété "show_sql" sur true.

42
mathieu

Dans les paramètres de configuration, définissez la propriété "show_sql" sur true. Cela entraînera la sortie du SQL dans les fichiers journaux de NHibernate avec la permission de log4net.

18
Ian Nelson

Je suis un peu en retard, je sais, mais cela fait l'affaire et il est indépendant de l'outil/db/framework. Au lieu de ces options valides, j'utilise NH Interceptors .

Au début, implémentez une classe qui étend NHibernate.EmptyInterceptor et implémente 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);
        }
    }
}

Ensuite, passez simplement une instance lorsque vous ouvrez votre session. Assurez-vous de ne le faire que dans DEBUG:

public static void OpenSession() {

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

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

#endif
}

Et c'est tout.

A partir de maintenant, vos commandes sql comme celles-ci ...

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

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

.. sont affichés directement dans votre fenêtre de sortie:

NH: sélectionnez cast (comptez (*) comme INT) en tant que col_0_0_ dans les messages post0_

NH: sélectionnez post0_.Id comme Id3_, post0_.user_id comme user2_3_, post0_.Title comme Title3_, post0_.Slug comme Slug3_, post0_.Content as Content3_, post0_.created_at as created6_3_, post0_.updated_at as updated7_3___0___0 des messages post0_ ordre par post0_.created_at desc limit? décalage ?

13
Alexander

Utilisez le profileur de serveur SQL.

EDIT (1 an plus tard): Comme @Toran Billups l'indique ci-dessous, le profileur NHibernate Ayende a écrit est très très cool.

6
Iain Holder

Vous pouvez également essayer NHibernate Profiler (essai de 30 jours si rien d'autre). Cet outil est le meilleur autour de IMHO.

Cela montrera non seulement le SQL généré mais aussi les avertissements/suggestions/etc

5
Toran Billups

Il existe une bonne référence pour la journalisation NHibernate à: Comment configurer Log4Net pour une utilisation avec NHibernate . Il comprend des informations sur la journalisation de toutes les instructions SQL générées par NHibernate.

3
Sean Carpenter

Nhibernate Profiler est une option, si vous devez faire quelque chose de sérieux.

1
Dan

Si vous utilisez SQL Server (pas Express), vous pouvez essayer SQL Server Profiler.

1
Big McLargeHuge