c# - 如何配置 Fluent NHibernate 以将查询输出到 Trace 或 Debug 而不是控制台?

标签 c# .net asp.net nhibernate fluent-nhibernate

如何配置 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/

相关文章:

c# - 调用 WebRequest 以调用 Web 服务的非常简单的调用就是每次以某种方式进行两次调用,一个没有凭据,一个有?

c# - 无法获取未定义或空引用的属性 'hide'

asp.net - 存储过程查询中的 SQL 注入(inject)

c# - 如何通过 StartsWith 或包含搜索值查找列表中的第一个或最后一个字符串而不添加到另一个列表

c# - 使用 ASP.NET MVC4 检索在数据库中存储为字节数组的图像的好方法?

c# - 无法让 XmlDocument.SelectNodes 检索我的任何节点?

c# - 具有动态 maxCount 的 SemaphoreSlim

javascript - jquery focusin 事件未触发

asp.net - SessionID 相同但 session 数据不同

c# - Gridview,更新功能影响所有行而不是单行