C# 将语句输出到控制台时,请参阅Fluent NHibernate中的更新参数 介绍

C# 将语句输出到控制台时,请参阅Fluent NHibernate中的更新参数 介绍,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,从这里提供的答案开始,除了输出的信息外,其他信息都很好地输出到控制台?而不是参数的实际值 此外,使用ShowSql不会输出任何更新行 问题 是否有办法在调试控制台中查看更新、参数和所有内容 实施细节 使用拦截器 从年起,我实施了以下措施: private class Interceptor : EmptyInterceptor { public override SqlString OnPrepareStatement(SqlString sql) { var s

从这里提供的答案开始,除了输出的信息外,其他信息都很好地输出到控制台?而不是参数的实际值

此外,使用ShowSql不会输出任何更新行

问题 是否有办法在调试控制台中查看更新、参数和所有内容

实施细节 使用拦截器 从年起,我实施了以下措施:

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语句。

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

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

dbConfig.AdoNetBatchSize(0);
dbConfig.ShowSql();
dbConfig.FormatSql();
然后在更新之后,需要调用Flush来刷新批处理

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

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

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

如果您正在创建一个web应用程序,您可以使用Spile和NHibernate.Spile Nuget包来检查正在进行的数据库调用


这有显示的参数。

您好,您能解释一下这有什么帮助吗?@dav_我几年前遇到过这个问题,回答得太快了,我忘记了ADONebatchSize步骤,希望这有帮助