Comment configurer Fluent NHibernate pour que les requêtes soient affichées dans Trace ou Debug au lieu de Console ? J'utilise MsSqlConfiguration.MsSql2008.ShowSql()
mais elle n'a pas de paramètres et je ne trouve rien sur Google.
Réponses
Trop de publicités?Je vois dans les forums et les blogs que beaucoup d'autres personnes avant moi ont cherché un moyen d'obtenir les instructions SQL au moment où elles sont préparées pour l'exécution. La réponse est généralement du type "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 recherche, d'investigation et de tentatives ratées, j'ai fini par trouver 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 ce dont vous avez besoin.
Dans votre gestionnaire de connexion, connectez votre intercepteur comme ceci :
protected virtual void Configure(FluentConfiguration config)
{
config.ExposeConfiguration(x =>
{
x.SetInterceptor(new SqlStatementInterceptor());
});
}
Ce n'est pas si compliqué. De mon point de vue, c'est certainement plus facile que d'essayer de faire passer tout ce XML par Fluent vers NHibernate - puisque Fluent fait abstraction du fichier XML.
Gardez à l'esprit que vous ne pouvez avoir qu'un seul Interceptor - donc vous devrez peut-être intégrer cette fonctionnalité à votre Interceptor existant, si vous en avez déjà un. Sur cette note, vous pourriez vouloir lui donner un nom plus large - par exemple MyAppInterceptor, afin de ne pas impliquer un but spécifique, parce que vous pourriez vouloir y ajouter d'autres fonctionnalités plus tard.
Vous voulez probablement utiliser log4net, pas ShowSql. Voici une configuration pour envoyer les requêtes à Debug :
<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>
Puis appelez-le depuis votre code avant d'ouvrir une session NHibernate :
log4net.Config.XmlConfigurator.Configure();
Lorsque vous ajoutez une référence à la DLL log4net, veillez à définir sa propriété "Copy Local" sur "true".
Ce n'est pas spécifique à FluentNHibernate, cela fonctionne de la même manière dans n'importe quelle variante de NHibernate.
Je n'ai pas essayé cela avec SQL Server, mais avec SQLite, le code suivant affichera le SQL généré dans la fenêtre de l'utilisateur. Sortie (menu Debug -> Windows -> Output, dans VS2008).
La liste déroulante "Show output from :" de la fenêtre Output doit être réglée sur "Debug" - VS2008 l'a fait 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 - activer cette fonction peut ralentir considérablement l'exécution.