Как просмотреть SQL, сгенерированный nHibernate? версия 1.2
Как просмотреть SQL, сгенерированный nHibernate?
Ответ 1
В файле app.config/web.config можно добавить что-то вроде этого:
в configSections node:
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
в конфигурации node:
<log4net>
<appender name="NHibernateFileLog" type="log4net.Appender.FileAppender">
<file value="logs/nhibernate.txt" />
<appendToFile value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n" />
</layout>
</appender>
<logger name="NHibernate.SQL" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="NHibernateFileLog"/>
</logger>
</log4net>
И не забудьте позвонить
log4net.Config.XmlConfigurator.Configure();
при запуске приложения или поместить
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
в файле assemblyinfo.cs
В настройках конфигурации установите для свойства show_sql значение true.
Ответ 2
В настройках конфигурации установите для свойства show_sql значение true. Это приведет к тому, что SQL будет выводиться в файлах NHibernate с помощью log4net.
Ответ 3
Использовать профилировщик sql-сервера.
EDIT (1 год спустя): Как утверждает @Toran Billups, профайлер NHibernate Айенде очень крут.
Ответ 4
Вы также можете попробовать NHibernate Profiler (30-дневная пробная версия, если ничего больше). Этот инструмент лучше всего подходит для IMHO.
Это не только покажет сгенерированный SQL, но также предупреждения/предложения/etc
Ответ 5
Я немного опоздал, знаю, но это трюк, и это инструмент /db/framework независим. Вместо этих допустимых вариантов я использую NH Interceptors.
Сначала реализуем класс, который расширяет NHibernate.EmptyInterceptor и реализует NHibernate.IInterceptor:
using NHibernate;
namespace WebApplication2.Infrastructure
{
public class SQLDebugOutput : EmptyInterceptor, IInterceptor
{
public override NHibernate.SqlCommand.SqlString
OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
{
System.Diagnostics.Debug.WriteLine("NH: " + sql);
return base.OnPrepareStatement(sql);
}
}
}
Затем просто передайте экземпляр при открытии сеанса. Обязательно сделайте это только в DEBUG:
public static void OpenSession() {
#if DEBUG
HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession(new SQLDebugOutput());
#else
HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession();
#endif
}
И что это.
С этого момента ваши команды sql, подобные этим...
var totalPostsCount = Database.Session.Query<Post>().Count();
var currentPostPage = Database.Session.Query<Post>()
.OrderByDescending(c => c.CreatedAt)
.Skip((page - 1) * PostsPerPage)
.Take(PostsPerPage)
.ToList();
.. показаны прямо в окне вывода:
NH: выберите cast (count (*) как INT) как col_0_0_ из сообщений post0_
NH: выберите post0_.Id как Id3_, post0_.user_id как user2_3_, post0_.Title as Title3_, post0_.Slug as Slug3_, post0_.Content as Content3_, post0_.created_at как created6_3_, post0_.updated_at как обновленный7_3_, post0_.deleted_at как deleted8_3_ из сообщений post0_ order by post0_.created_at desc limit? смещение?
Ответ 6
Существует хорошая ссылка для регистрации NHibernate по адресу: Как настроить Log4Net для использования с NHibernate. Он содержит информацию о регистрации всех SQL-запросов, созданных NHibernate.
Ответ 7
Nhibernate Profiler - это вариант, если вам нужно что-то серьезное.
Ответ 8
Если вы используете SQL Server (не Express), вы можете попробовать профайлер SQL Server.