¿Cómo configurar Fluidez NHibernate para enviar consultas a Rastreo o Depuración en lugar de a la Consola? Estoy usando MsSqlConfiguration.MsSql2008.ShowSql()
pero no tiene parámetros y no puedo encontrar nada en Google.Cómo configurar Fluidez NHibernate para enviar consultas a Trace o Debug en lugar de Console?
Respuesta
Puedo ver desde el foro y publicaciones en 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.
redactar 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, usted no tiene que Trace.WriteLine()
aquí, se podría escribir en un archivo de registro, o cualquier otra cosa que necesite.
En el administrador de conexión, conectar su interceptor de este modo:
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 solo interceptor, 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 funciones más adelante.
Espero que esto sea útil para otra persona! :-)
Probablemente desee utilizar log4net, no ShowSql. Aquí está una cierta configuración para enviar consultas a la depuración:
<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 llamar a esto desde el código antes de la apertura de una sesión de NHibernate:
log4net.Config.XmlConfigurator.Configure();
Cuando se agrega una referencia a la DLL log4net, asegúrese de establecer su propiedad "Copiar local" a "verdadero".
Esto no es específico de FluentNHibernate, funciona igual en cualquier variante de NHibernate.
Noobish pregunta, pero, ¿dónde poner este archivo de configuración en un proyecto de winforms?Muchos sitios web de documentación de Hibernate están caídos, y simplemente no puedo encontrar dónde colocar esta información XML. Gracias. –
@Mike - debe ir a app.config en el directorio raíz del proyecto, que se copia al directorio bin como
¡Excelente para tener respuesta en un comentario sobre una respuesta de más de 3 años! Muchas gracias! –
No he intentado esto con SQL Server, pero con SQLite, el siguiente código mostrará el SQL generado en la ventana 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.
La ventana de salida en Visual Studio muestra la salida de Consola, Depuración y Rastreo. El método ShowSql escribe en la consola, no en Debug o Trace. Su recomendación no es diferente de lo que él ha dicho que ya está haciendo. –
@Michael: ¡Acabo de volver a probar esto, y funciona EXACTAMENTE como se describe! ¿Posiblemente una diferencia en la implementación de la interfaz FNH con SQLite frente a SQL Server? –
No es lo mismo "Depurar" (observe que no hay opción para "Rastreo" o "Consola"). :) Para ver si realmente está escribiendo en Debug, use algo como http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx –
- 1. NHibernate o Fluidez NHibernate?
- 2. cómo configurar generate_statistics = true con fluidez nhibernate
- 3. Fluidez NHibernate LazyLoad Issues
- 4. aprendiendo nhibernate (con o sin fluidez)
- 5. Stack Trace Console en IntelliJ IDEA
- 6. Fluidez NHibernate pregunta
- 7. uno-a-uno con fluidez nhibernate?
- 8. enumeración Mapeo con nhibernate fluidez
- 9. Fluidez Nhibernate Enum Mapeo
- 10. currentsessioncontext con fluidez nhibernate cómo hacerlo?
- 11. Cómo unirse a la tabla en nhibernate con fluidez
- 12. Asignación de componentes anidados en Fluidez NHibernate
- 13. Fluidez NHibernate AutoMapping con discriminator
- 14. Atributos de mapeo de NHibernate versus NHibernate con fluidez
- 15. Fluidez NHibernate: ¿cómo asignar una subclase uno a uno?
- 16. configurar el mapeo de NHibernate con Fluidez para permitir INSERT solo?
- 17. Fluidez NHibernate: ¿Cómo crear mapeo bidireccional uno a uno?
- 18. Fluidez nHibernate: mapeo no compatible tipo
- 19. 2010 Guía para principiantes para nHibernate con fluidez
- 20. Prevenir fluidez NHibernate seleccionar n + 1
- 21. NHibernate disjunction que da como resultado AND consultas en lugar de O
- 22. Generar asignaciones XML de fluidez Nhibernate
- 23. Niveles de registro: ¿Consideraría DEBUG más fino que TRACE?
- 24. 101 tutorial para configurar nhibernate?
- 25. Mapa Enum como Int con Fluidez NHibernate y NHibernate 3
- 26. Cómo mapear IDictionary <cadena, objeto> en Fluidez NHibernate?
- 27. Cómo averiguar si se compiló un ensamblado .NET con el indicador TRACE o DEBUG
- 28. Fluido NHibernate: cómo configurar para Oracle?
- 29. nhibernate fluidez hasOne WithForeignKey no trabajar
- 30. con fluidez nhibernate no admitida excepción newexpression
Gran solución, simple como el infierno y simplemente funciona, se la agregó a mi prueba la fábrica de sesión, aunque es posible agregarla solo con #if DEBUG. ¡Gracias! –
¿Quizás es posible completar los parámetros también? Obtengo '?' (Signos de interrogación) en lugar de valores en las consultas como 'SELECT * FROM MyObject WHERE Id =?'. Veo que hay un 'IEnumerable NHibernate.SqlCommand.SqlString.GetParameters()' –
@Mike replace 'sql.ToString()' con 'base.OnPrepareStatement (sql)' –