简介
继如何配置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 应用,可以使用 Glimpse
和 NHibernate.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处理批处理生命周期并做它的事情。