Знам, че можете да направите това с nhibernate Profiler, но това не е безплатен инструмент. Бих се интересувал и от безплатна алтернатива за това.
Редактиране
Изглежда, че има персонализиран appender за log4net, който ще го форматира така, че всъщност да можете да стартирате sql, който NHibernate изплюва. Видях го в блога, посочен по-долу:
http://gedgei.wordpress.com/ 2011/09/03/logging-nhibernate-queries-with-parameters/
По-долу е кодът, който взех от горния блог и модифицирах, за да работи с Guids:
/// <summary>
/// This log4net appender is used for outputting NHibernate sql statements in a sql management studio friendly format.
/// This means you should be able to copy the sql output from this appender and run it directly. Normally in the NHibernate
/// output there is parameterized sql that must be manually edited to run it.
/// </summary>
public class NHibernateSqlAppender : ForwardingAppender
{
private const string GuidRegex = @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b";
protected override void Append(LoggingEvent loggingEvent)
{
var loggingEventData = loggingEvent.GetLoggingEventData();
if (loggingEventData.Message.Contains("@p"))
{
StringBuilder messageBuilder = new StringBuilder();
string message = loggingEventData.Message;
var queries = Regex.Split(message, @"command\s\d+:");
foreach (var query in queries)
messageBuilder.Append(ReplaceQueryParametersWithValues(query));
loggingEventData.Message = messageBuilder.ToString();
}
base.Append(new LoggingEvent(loggingEventData));
}
public static string ReplaceQueryParametersWithValues(string query)
{
string returnQuery = Regex.Replace(query, @"@p\d+(?=[,);\s])(?!\s*=)", match =>
{
Regex parameterValueRegex = new Regex(string.Format(@".*{0}\s*=\s*(.*?)\s*[\[].*", match));
return parameterValueRegex.Match(query).Groups[1].ToString();
});
//Place single quotes around all Guids in the sql string
returnQuery = Regex.Replace(returnQuery, GuidRegex, "'$0'", RegexOptions.IgnoreCase);
int parameterListIndex = returnQuery.LastIndexOf("@p0");
if (parameterListIndex != -1)
{
//Truncate the paramter list off the end since we are substituting the actual values in the regular expression above
//The -1 also cuts off the semicolon at the end
return returnQuery.Substring(0, parameterListIndex).Trim();
}
return returnQuery.Trim();
}
}
Ето как бихте изпратили този изход към конзолата:
<appender name="NHibernateSqlAppender" type="NHibernatePlayground.Custom.NHibernateSqlAppender, NHibernatePlayground">
<appender-ref ref="console" />
</appender>
<root>
<appender-ref ref="NHibernateSqlAppender" />
</root>
ЗАБЕЛЕЖКА:
Изглежда, че това причинява някои доста значителни проблеми с производителността в производствена система. Все още не съм намерил по-добър начин да направя това, но за всеки, който използва това, внимавайте с тези проблеми с производителността