如何配置Fluent NHibernate以输出查询以进行跟踪或调试,而不是控制台?

推荐答案

我可以从各地的论坛和博客帖子中看到,在我之前的很多人都在寻找一种方法来获取SQL语句,因为它们正在准备执行.答案通常是"你不能"或"你不应该".

不管我是否应该,这就是我想要的.

经过数小时的搜索、调查和失败的try ,我终于想出了这个主意.

写一个拦截器:

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(),你可以将其写入日志(log)文件,或者任何你需要的东西.

在连接管理器中,连接拦截器,如下所示:

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

没那么复杂.从我的Angular 来看,当然比试图通过Fluent将所有这些XML推送到NHibernate更容易——因为Fluent将XML文件抽象出来.

请记住,您只能有一个拦截器——因此,如果您已经有一个拦截器,您可能需要将此功能与现有拦截器集成.在这一点上,你可能想给它起一个更宽泛的名字——例如MyAppInterceptor,这样就不意味着有特定的用途,因为你以后可能想给它添加其他功能.

Asp.net相关问答推荐

如何在 C# 中生成一个随机的 10 位数字?

jQuery隐藏字段

取消选中时 ASP.NET CheckBox 不会触发 CheckedChanged 事件

使用 Owin 身份验证的服务器端声明缓存

模型项的类型为 CookMeIndexViewModel,但需要类型为 IEnumerable 的模型项

我可以根据角色隐藏/显示 asp:Menu 项吗?

将复选框的值传递给 asp.net mvc4 中的控制器操作

ASP.NET 日期时间 Select 器

每个 'HttpRequest' 在 ASP.NET 中都有自己的线程吗?

如何在 IIS 7.5 上使用 ASP.NET 表单身份验证保护静态文件?

等价于 ASP.NET Core 中的 Html.RenderAction

C# 7 本地函数未按预期工作且未显示错误

如何验证用户在 CheckBoxList 中 Select 了至少一个复选框?

如何验证 WebClient 请求?

System.Reflection.Assembly.LoadFile 锁定文件

将列表转换为 json 格式 - 快速简便的方法

使用 Web.Config 转换的高级任务

在 ASP.NET MVC 中获取服务器机器名称?

为什么 C# 对于 CSC 文件会遇到此错误?

try 为 Medium Trust 开发是否会失败?