write visual studio print namespace log debug collection c# .net asp.net nhibernate fluent-nhibernate

c# - visual - ¿Cómo configurar Fluidez NHibernate para enviar consultas a Trace o Debug en lugar de Console?



debug write (3)

Probablemente quiera usar log4net, no ShowSql. Aquí hay alguna configuración para enviar consultas a 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>

Y luego llama a esto desde tu código antes de abrir una sesión de NHibernate:

log4net.Config.XmlConfigurator.Configure();

Cuando agrega una referencia a la DLL de log4net, asegúrese de establecer su propiedad "Copiar local" en "verdadero".

Esto no es específico de FluentNHibernate, funciona igual en cualquier variante de NHibernate.

¿Cómo configurar Fluidez NHibernate para enviar consultas a Trace o Debug en lugar de Console? Estoy usando MsSqlConfiguration.MsSql2008.ShowSql() pero no tiene parámetros y no puedo encontrar nada en Google.


No he intentado esto con SQL Server, pero con SQLite, el siguiente código mostrará el SQL generado en la ventana de Salida (menú Depurar -> Windows -> Salida, en VS2008).

El cuadro combinado "Mostrar salida desde:" en la ventana Salida debe establecerse en "Depurar" - VS2008 hizo eso automáticamente.

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

Una palabra de advertencia: encender esto puede ralentizar considerablemente la ejecución.


Puedo ver desde foros y publicaciones de blogs en todas partes que muchos otros antes que yo han buscado una forma de obtener las declaraciones SQL mientras se preparan para su ejecución. La respuesta generalmente es algo como "no se puede" o "no se debe".

Si debería o no, eso es lo que quería.

Después de horas de búsqueda, investigación e intentos fallidos, y finalmente se me ocurrió esto.

Escribe un interceptor:

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

Por supuesto, no necesita Trace.WriteLine() aquí, puede escribirlo en un archivo de registro, o en cualquier otra cosa que necesite.

En su administrador de conexión, conecte su Interceptor de la siguiente manera:

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

No es tan complicado. Desde mi punto de vista, ciertamente es más fácil que tratar de obtener todo este XML impulsado a través de Fluent a NHibernate, ya que Fluent abstrae el archivo XML.

Tenga en cuenta que solo puede tener un Interceptor único, por lo que puede necesitar integrar esta función con su Interceptor existente, si ya tiene uno. En ese sentido, es posible que desee darle un nombre más amplio, por ejemplo, MyAppInterceptor, para no implicar un propósito específico, porque es posible que desee agregar otras características más adelante.

Espero que esto sea útil para otra persona! :-)