쿼리를 콘솔 대신 추적 또는 디버그로 출력하도록 Fluent NHibernate를 구성하는 방법은 무엇입니까?
쿼리를 콘솔 대신 추적 또는 디버그로 출력하도록 Fluent NHibernate를 구성하는 방법은 무엇입니까?사용 중MsSqlConfiguration.MsSql2008.ShowSql()
하지만 매개 변수가 없고 구글에서 아무것도 찾을 수 없습니다.
포럼과 블로그 게시물을 통해 이전에 많은 사람들이 SQL 문을 실행할 준비가 되어 있을 때 이를 얻을 방법을 찾고 있음을 알 수 있습니다.답은 일반적으로 "할 수 없다" 또는 "해서는 안 된다"와 같은 것입니다.
제가 해야 할지 말아야 할지, 그게 제가 원하던 것입니다.
몇 시간 동안의 수색과 조사, 그리고 실패한 시도 끝에 마침내 저는 이것을 생각해냈습니다.
인터셉터를 작성합니다.
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;
}
}
물론, 그럴 필요는 없습니다.Trace.WriteLine()
여기서, 당신은 그것을 로그 파일이나 당신이 필요로 하는 다른 것에 쓸 수 있습니다.
연결 관리자에서 인터셉터를 다음과 같이 연결합니다.
protected virtual void Configure(FluentConfiguration config)
{
config.ExposeConfiguration(x =>
{
x.SetInterceptor(new SqlStatementInterceptor());
});
}
별로 복잡하지 않다.제 관점에서, Fluent는 XML 파일을 추상화하기 때문에 이 모든 XML을 Fluent에서 NHibernate로 푸시하는 것보다 훨씬 쉽습니다.
하나의 인터셉트카만 사용할 수 있으므로 이미 인터셉트카가 있는 경우 이 기능을 기존 인터셉트카와 통합해야 할 수도 있습니다.따라서 더 넓은 이름을 지정할 수 있습니다. 예를 들어,나중에 다른 기능을 추가하고 싶을 수도 있기 때문에 특정 목적을 암시하지 않도록 MyAppInterceptor.
ShowSql이 아닌 log4net을 사용하는 것이 좋습니다.다음은 디버그로 쿼리를 보내는 몇 가지 구성입니다.
<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>
그런 다음 NHibernate 세션을 열기 전에 코드에서 다음을 호출합니다.
log4net.Config.XmlConfigurator.Configure();
log4net DLL에 참조를 추가할 때 "Copy Local" 속성을 "true"로 설정해야 합니다.
Fluent에만 해당되지 않습니다.NHibernate, 그것은 NHibernate의 어떤 변형에서도 동일하게 작동합니다.
SQL Server에서는 시도하지 않았지만 SQLite에서는 다음 코드가 출력 창에 생성된 SQL을 표시합니다(VS2008의 디버그 메뉴 -> Windows -> 출력).
출력 창의 "Show output from:" 콤보 상자는 "Debug"로 설정되어야 합니다. VS2008은 자동으로 이를 수행했습니다.
sessionFactory = Fluently.Configure()
.Database(SQLiteConfiguration.Standard
.UsingFile(DbFile)
// Display generated SQL in Output window
.ShowSql()
)
.Mappings(m => m.AutoMappings.Add( GetAutoPersistenceModel() ))
.BuildSessionFactory()
;
경고 한 마디 - 이 옵션을 설정하면 실행 속도가 상당히 느려질 수 있습니다.
언급URL : https://stackoverflow.com/questions/2134565/how-to-configure-fluent-nhibernate-to-output-queries-to-trace-or-debug-instead-o
'source' 카테고리의 다른 글
Javascript에서 사전 이해 또는 객체 'map' (0) | 2023.08.24 |
---|---|
핀을 터치하지 않고 MKnotationView의 콜아웃 뷰를 트리거하는 방법은 무엇입니까? (0) | 2023.08.24 |
텍스트 너비 계산 (0) | 2023.08.24 |
Fancybox가 jQuery v1.9.0에서 작동하지 않음 [f.browser가 정의되지 않음/'msie' 속성을 읽을 수 없음] (0) | 2023.08.24 |
iTunes Connect에서 앱 삭제 (0) | 2023.08.24 |