在将语句输出到控制台时,请参阅Fluent NHibernate中的UPDATE参数



简介

继如何配置Fluent NHibernate以将查询输出到跟踪或调试而不是控制台之后? 那里提供的答案很好地将信息输出到控制台,不同之处在于它输出?而不是参数的实际值。

此外,使用 ShowSql() 不会输出任何UPDATE行。

问题

有没有办法在调试控制台中查看更新、参数和所有内容?

实现细节

使用拦截器

从如何配置Fluent NHibernate到将查询输出到跟踪或调试而不是控制台?,我已经实现了以下内容:

private class Interceptor : EmptyInterceptor
{
    public override SqlString OnPrepareStatement(SqlString sql)
    {
        var s = base.OnPrepareStatement(sql);
        Debug.WriteLine(s.ToString());
        return s;
    }
}
//... 
var factory = Fluently.Configure()
                      // ...
                      .ExposeConfiguration(c => c.SetInterceptor(new Interceptor())
                      // ...

这导致输出如下

UPDATE [User] SET Email = ?, HashedPassword = ?, Name = ? WHERE Id = ?

使用 ShowSql((

从这个博客中,我实现了以下内容

public class CustomDebugWriter : System.IO.TextWriter
{
    public override void WriteLine(string value)
    {
        Debug.WriteLine(value);
        base.WriteLine(value);
    }
    public override void Write(string value)
    {
        Debug.Write(value);
        base.Write(value);
    }
    public override System.Text.Encoding Encoding
    {
        get { return new UTF8Encoding(); }
    }
}
// ...
Console.SetOut(new CustomDebugWriter());
var dbConfig = MsSqlConfiguration.MsSql2012.ConnectionString(
    c => c.FromConnectionStringWithKey(connectionStringKey));
dbConfig.ShowSql();

根本不输出 UPDATE 语句。

这是一种解决方法,而不是真正的答案。

如果要创建 Web 应用,可以使用 GlimpseNHibernate.Glimpse Nuget 包来检查正在进行的数据库调用。

这显示了参数。

它与 ISession 的伪工作单元和批处理有关。

使用Fluent-NHibernate,您需要设置AdoNetBatchSize属性:

dbConfig.AdoNetBatchSize(0);
dbConfig.ShowSql();
dbConfig.FormatSql();

然后在进行更新后,您需要调用Flush()来刷新"批处理"。

entity.Title = "test title";
Session.Update(entity);
Session.Flush();

这实际上取决于您的体系结构、您在哪里调用它,或者您是否使用自己的工作单元实现。我只担心我的集成测试项目中的 SQL 输出,所以这很容易,我只是在拆解时调用 Flush。它可能不是你想在你的应用程序中扔的东西,通常最好让NHibernate处理批处理生命周期并做它的事情。

相关内容

最新更新