如何配置 Fluent NHibernate 以将查询输出到 Trace 或 Debug 而不是 Console?
我正在使用 MsSqlConfiguration.MsSql2008.ShowSql()
但它没有参数,而且我在 Google 上找不到任何内容。
最佳答案
我可以从到处都是的论坛和博客帖子中看到,在我之前的许多其他人都在寻找一种方法来获取准备执行的 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());
});
}
没那么复杂。从我的角度来看,这肯定比尝试将所有这些 XML 通过 Fluent 推送到 NHibernate 更容易 - 因为 Fluent 将 XML 文件抽象出来。
请记住,您只能拥有一个拦截器 - 因此如果您已经拥有一个拦截器,则可能需要将此功能与现有的拦截器集成。关于这一点,您可能想给它起一个更广泛的名称 - 例如MyAppInterceptor,以免暗示特定用途,因为您可能希望稍后向其添加其他功能。
关于c# - 如何配置 Fluent NHibernate 以将查询输出到 Trace 或 Debug 而不是控制台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2134565/