Я вижу по сообщениям на форумах и в блогах повсюду, что многие другие до меня искали способ получить операторы SQL по мере их подготовки к выполнению. Ответом обычно является что-то вроде «вы не можете» или «вы не должны».
Должен ли я или нет, это то, что я хотел.
После нескольких часов поиска, расследования и неудачных попыток, и, наконец, я придумал это.
Запишите перехватчик:
using NHibernate;
using System.Diagnostics;
public class SqlStatementInterceptor : EmptyInterceptor
{
public override NHibernate.SqlCommand.SqlString OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
{
Trace.WriteLine(sql.ToString());
return sql;
}
}
Конечно, вам не нужно Trace.WriteLine()
здесь, вы можете записать его в файл журнала или что-то еще, что вам нужно.
В вашем менеджере соединений подключите ваш перехватчик так:
protected virtual void Configure(FluentConfiguration config)
{
config.ExposeConfiguration(x =>
{
x.SetInterceptor(new SqlStatementInterceptor());
});
}
Это не так сложно. С моей точки зрения, это гораздо проще, чем пытаться протолкнуть весь этот XML через Fluent в NHibernate - так как Fluent абстрагирует XML-файл.
Имейте в виду, у вас может быть только один перехватчик - поэтому вам может потребоваться интегрировать эту функцию с существующим перехватчиком, если он у вас уже есть. На этой ноте вы можете дать ей более широкое имя - например, MyAppInterceptor, чтобы не подразумевать конкретную цель, потому что вы можете захотеть добавить другие функции к нему позже.
Надеюсь, это поможет кому-то еще! : -)