Fluent NHibernate Sorgularını Output Ekranına Yazdırmak


7 Temmuz 2015 Hikmet Okumuş Fluent NHibernate

Fluent NHibernate ile işlem yaparken arka planda NHibernate, kullanılan provider türüne göre sql sorguları oluşturmaktadır. Yazılım geliştirme aşamasında oluşan bu sql sorgularını görmek isteyebiliriz. Bu işlem için 2 yöntemden bahsedicem.
Birinci yöntem InitializeSessionFactory() metodu içerisinde ConnectionString metodundan hemen sonra ShowSql metodunu eklemek.
        private static void InitializeSessionFactory()
        {
            _sessionFactory = Fluently.Configure().Database(MsSqlConfiguration.MsSql2008
                .ConnectionString(@"Server=server;initial catalog=NHibernateSample; user=user;password=pass;").ShowSql())
                .Mappings(m => m.FluentMappings.AddFromAssembly(typeof(Program).Assembly))
                .ExposeConfiguration(cfg =>
                {
                    new SchemaUpdate(cfg).Execute(true, true);                    
                })
                .BuildSessionFactory();
        }
Bu işlem sonrasında aşağıdaki gibi Output ekranından oluşan sorguları görebiliriz.

www.hikmetokumus.com

İkinci yöntem ise Interceptor sınıfı oluşturularak yapılacaktır. Önce örnek sınıf bilgisini paylaşayım. Ardından açıklamasını yapalım.
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;
    }
}
InitializeSessionFactory metodu içeriği aşağıdaki gibi olacaktır.
        private static void InitializeSessionFactory()
        {
            _sessionFactory = Fluently.Configure().Database(MsSqlConfiguration.MsSql2008
                .ConnectionString(@"Server=server;initial catalog=NHibernateSample; user=user;password=pass;"))
                .Mappings(m => m.FluentMappings.AddFromAssembly(typeof(Program).Assembly))
                .ExposeConfiguration(cfg =>
                {
                    new SchemaUpdate(cfg).Execute(true, true);
                    cfg.SetInterceptor(new SqlStatementInterceptor());
                })
                .BuildSessionFactory();
        }
Yukarıda görüldüğü gibi ExposeConfiguration metodu içerisine sınıfımızı ekledik.
Bu işlem sonucunda da Output ekranında aynı çıktı oluşacaktır. Peki 1. yöntem varken neden 2. yöntemi kullanalım ?
1. yöntemde sadece sql sorgularının çıktılarını görebilirsiniz. Ama 2. yöntemde sql çıktılarını loglayabilir, TraceListener gibi bir yapıda gösterebilirsiniz. Her sorgu çalıştırılmaya hazır hale geldiğinde OnPrepareStatement metodu size parametresinde bulunan SqlString tipi ile sorgu bilgisini döndürecektir.
Base' de yer alan EmptyInterceptor sınıfını incelediğinizde içerisinde bir çok sanal metodun olduğunu göreceksiniz. İhtiyacınıza göre sınıf içerisindeki sanal metodlarda ezilerek kullanılabilmektedir.

Başarılar dilerim.



Yorum Ekle