Comment configurer NHibernate Fluent en sortie des requêtes pour tracer ou déboguer au lieu de la Console?

comment configurer Fluent NHibernate à des requêtes de sortie pour tracer ou déboguer au lieu de la Console? Je suis à l'aide de MsSqlConfiguration.MsSql2008.ShowSql() mais il n'y a aucun paramètre et je ne trouve rien sur Google.

46
demandé sur André Pena 2010-01-25 21:26:02

3 réponses

je peux voir à partir du forum et des billets de blog partout que beaucoup d'autres avant moi ont cherché un moyen d'obtenir les déclarations SQL pendant qu'ils se préparent pour l'exécution. La réponse est typiquement quelque chose du genre "vous ne pouvez pas", ou "vous ne devriez pas".

que je le veuille ou non, c'est ce que je voulais.

après des heures de recherches, d'enquêtes et de tentatives ratées, et finalement j'ai trouvé ceci.

Rédiger un intercepteur:

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

bien sûr, vous n'avez pas à Trace.WriteLine() ici, vous pouvez l'écrire dans un fichier journal, ou tout autre chose dont vous avez besoin.

dans votre gestionnaire de connexion, branchez votre intercepteur comme ceci:

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

Ce n'est pas compliqué. De mon point de vue, certainement plus facile que d'essayer de faire passer tout ce XML par Fluent à NHibernate - depuis Fluent résume le fichier XML loin.

Gardez à l'esprit, vous ne pouvez avoir qu'un seul Intercepteur - vous devrez donc peut-être intégrer cette fonctionnalité à votre intercepteur existant, si vous en avez déjà un. Sur cette note, vous pouvez lui donner une plus large nom - par exemple, MyAppInterceptor, afin de ne pas impliquer un but précis, parce que vous pouvez ajouter d'autres fonctionnalités plus tard.

j'Espère que cela sera utile à quelqu'un d'autre! : -)

96
répondu mindplay.dk 2011-07-20 15:11:45

vous voulez probablement utiliser log4net, pas ShowSql. Voici une configuration pour envoyer des requêtes au débogage:

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

et puis appelez cela à partir de votre code avant d'ouvrir une session NHibernate:

log4net.Config.XmlConfigurator.Configure();

lorsque vous ajoutez une référence à la DLL log4net, assurez-vous de mettre sa propriété "Copy Local" à "true".

ceci n'est pas spécifique au FluentNHibernate, il fonctionne de la même façon dans n'importe quelle variante du NHibernate.

33
répondu Michael Maddox 2010-01-25 19:34:30

Je n'ai pas essayé avec SQL Server, mais avec SQLite, le code suivant affichera SQL généré dans le Sortie fenêtre (menu Déboguer -> Windows -> Sortie, dans VS2008).

la boîte bascule " Afficher la sortie de: "dans la fenêtre de sortie doit être définie à" déboguer " - VS2008 a fait cela pour moi automatiquement.

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

Un mot d'avertissement - en activant cette option peut ralentir considérablement l'exécution.

11
répondu Tom Bushell 2010-01-26 15:52:58