[英]How to configure Fluent NHibernate to output queries to Trace or Debug instead of Console?
如何配置Fluent NHibernate將查詢輸出到Trace或Debug而不是Console? 我正在使用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推送到NHibernate更容易 - 因為Fluent將XML文件抽象化了。
請記住,您只能擁有一個攔截器 - 因此您可能需要將此功能與現有的攔截器集成,如果您已有的話。 在這方面,您可能希望給它一個更廣泛的名稱 - 例如MyAppInterceptor,以免暗示特定目的,因為您可能希望稍后添加其他功能。
希望這對其他人有幫助! :-)
您可能想使用log4net,而不是ShowSql。 以下是一些向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>
然后在打開NHibernate會話之前從代碼中調用它:
log4net.Config.XmlConfigurator.Configure();
添加對log4net DLL的引用時,請確保將其“Copy Local”屬性設置為“true”。
這不是特定於FluentNHibernate,它在NHibernate的任何變體中都是一樣的。
我沒有嘗試使用SQL Server,但是使用SQLite,以下代碼將在“ 輸出”窗口中顯示生成的SQL(調試菜單 - > Windows - >輸出,在VS2008中)。
“輸出”窗口中的“顯示輸出:”組合框應設置為“調試” - VS2008會自動為我執行此操作。
sessionFactory = Fluently.Configure()
.Database(SQLiteConfiguration.Standard
.UsingFile(DbFile)
// Display generated SQL in Output window
.ShowSql()
)
.Mappings(m => m.AutoMappings.Add( GetAutoPersistenceModel() ))
.BuildSessionFactory()
;
一句警告 - 打開此功能可以大大減慢執行速度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.