从How to configure Fluent NHibernate to output queries to Trace or Debug instead of Console?开始,提供的答案很好地向控制台输出信息,但输出?
而不是参数的实际值。
此外,使用ShowSql()
不会输出任何UPDATE
行。
有没有办法在调试控制台中查看UPDATE,参数和所有内容?
从How to configure Fluent NHibernate to output queries to Trace or Debug instead of Console?开始,我实施了以下内容:
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 = ?
从this blog开始,我实施了以下内容
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语句。
答案 0 :(得分:0)
它与ISession的psuedo工作单元和批处理有关。
使用Fluent-NHibernate,您需要设置AdoNetBatchSize
属性:
dbConfig.AdoNetBatchSize(0);
dbConfig.ShowSql();
dbConfig.FormatSql();
然后,在进行更新后,您需要致电Flush()
以清除"批次"。
entity.Title = "test title";
Session.Update(entity);
Session.Flush();
这实际上取决于您的架构,您可以在哪里调用,或者您正在使用自己的工作单元实现。我只担心集成测试项目中的SQL输出,所以很容易,我只是在TearDown上调用Flush。它可能不是你想要放在你的应用程序中的东西,通常最好让NHibernate处理批量生命周期并做它的事情。
答案 1 :(得分:0)
这是一种解决方法,而不是一个真正的答案。
如果您正在创建网络应用,则可以使用Glimpse
和NHibernate.Glimpse
Nuget包来检查正在进行的数据库调用。
这显示了参数。