28 Şubat 2015 Cumartesi

ORM, NHibernate ve Fluent NHibernate Giriş

Herkese merhabalar.

   Uzun bir aradan sonra yeniden birlikteyiz. Bugünlerde merak sardığım NHibernate ve Fluent NHibernate konularını gelin hep birlikte örnekleri ile beraber anlayalım. Bu hafta konuyu daha iyi anlamanız açısından direkt kodlara girmek istemeyerek tanım odaklı anlatacağım; ancak önümüzdeki haftalarda bol bol örnekler ile konuları detaylı bir şekilde inceleyeceğiz. NHibernate’e geçmeden önce neyi neden yapacağımızı daha iyi anlamanız açısından, ORM kavramından bahsetmek istiyorum.

1. ORM 


      ORM (Object-Relational Mapping), nesneye yönelik bir programlama metodu sunan, ilişkisel
veritabanları ile nesne tabanlı uygulamaların arasındaki veri uyumunu sağlayan, nesnelerimizi ilişkisel veritabanındaki tablomuza bağlayan ve veri alış-verişini bizim için yapan bir tekniktir[1]. Neden biz bu tekniği kullanalım dediğinizi duyar gibiyim. Nedenlerini sıralayacak olursak; yazılan kodun veritabanından bağımsızlığını sunuyor. Bu sayede, veritabanınızı değiştirmek zorunda kaldığınızda, kodlamanızda sadece bağlantı ayarlarında değişiklik yapmanız gerekecek, böylelikle büyük bir külfetten kurtulmuş olacaksınız. ORM araçlarının çoğu açık kaynak kodludur, programlama dilinden bağımsızdır[2]. Ayrıca ORM, polymorphism, caching, transaction gibi karşılaşılan birçok soruna çözüm sunarak yazılımcıların işini kolaylaştırıyor[2].

2. NHibernate


    NHibernate’in ne olduğunu anlamak için öncelikle Hibernate’in tanımını bilmeliyiz. Hibernate, Java platformunda yazılmış, yukarıda bahsetmiş olduğum ORM’in araçlarından biridir[3]. NHibernate ise Hibernate’in .NET çatısı için yeniden yazılmış bir türevidir[3]. NHibernate, SQL sorgu cümleleri yazarak projelerimizdeki veritabanıyla iletişime geçme zahmetinden bizi kurtarır, ilgili veriler üzerinde ekleme, silme, güncelleme, veri çekme ve  birçok işlemi kolaylıkla yapmamıza olanak sağlar[4]. Veri yapılarınızı bildirirken iki farklı yol izleyebilirsiniz. Birincisi xml kodları ile veri yapınızı bildirmek diğeri ise ilgili sınıfları yazıp NHibernate’e sınıfa göre tabloları vb. oluşturmasını istediğinizi bildirmek ki ben bu yöntemi tercih edeceğim, bu yöntem Fluent NHibernate kullanımına girmektedir; ama yinede örneklerinizde tercih sizindir[4]. Hangi yöntem kolayınıza geliyorsa o yöntemi tercih etmelisiniz. Her ne kadar adı ürkünç gelse de konunun içine girdiğiniz zaman, özellikle büyük veritabanları olan kurumsal şirketlerden birinde yazılımcıysanız sizi ne büyük zahmetlerden kurtardığını gördükçe NHibernate vazgeçilmeziniz olacak. NHibernate ile ilgili bazı terimleri uygulama geliştirmeden önce bilmeniz, neyi ne için kullandığınızı daha rahat anlamanızı sağlayacaktır.

Session: Veritabanına bağlantı, veri çekimi ve basit bir “Unit of Work” implementasyonudur.

ICreteria API: Tekrar kullanılabilir, hızlı sorgular üretmek için geliştirililmiş bir yöntemdir.

HQL: String bazlı nesneler üzerine de uygulanabilen bir sorgu dilidir.

Schema Mapping: Veritabanında hangi tabloların hangi nesnelerle; hangi kolonların, hangi property’ler ile eşleşeceğini, ilişkilerin neler olduğunu belirttiğimiz hbm.xml uzantılı dosyalardır.

Dialect: NHibernate’in hangi veritabanı dilini kullanması gerektiğini belirttiğimiz veritabanına özel dildir[5]. 

NHibernate Avantajları:

Daha yüksek üretkenlik.
   o Sizin adınıza veritabanı  işlerini organize ederek sizi karmaşalardan kurtararak veriminizin artmasını sağlar[6].

Daha kolay bakım.
   o Daha az satır kod[6].

Veritabanı çeşidinden bağımsızlık.
   o ORM aracılığıyla yazılan veritabanı erişim kodları sayesinde kolaylıkla farklı veritabanlarında çalıştırılabilir[6].

NHibernate  Dezavantajları:

Performans[6].
Çoğu zaman Stored Procedure ve View’lardan yavaş çalışır[6].
XML mapping karışıklığı[6].
Öğrenilmesi biraz zaman alabilir[6].

3. Fluent NHibernate


     Fluent NHibernate’in NHibernate’in özelliklerinden farklı olan tarafı, veri yapılarının XML dosyası ile değil de kodlardaki sınıf yapıları ile eşleştirilmesidir[7]. Bu yöntem bazı kullanıcılara daha kolay gelmektedir; ancak her iki yöntemin de kendine has avantaj ve dezavantajları mevcuttur.

Fluent NHibernate Avantajları:

Daha az kod tekrarı.
    o Defalarca XML kodlarını tekrarlamanıza gerek kalmaz[8].

XML’e kıyasla daha anlaşılır kodlar[8].

XML kodları compiler tarafından derlenmediği için programı çalıştırmadığınız sürece hatalarınızı göremezsiniz[9].

Test edilebilirlik[8].

Veritabanı çeşidinden bağımsızlık[8].

Automapping özelliği mevcuttur[9].

XML’e kıyasla daha az kod satırı ile eşlemenizi daha kolay şekilde gerçekleştirebilirsiniz[9].

Fluent NHibernate  Dezavantajları:

Performans kaybı daha çoktur[6].

NHibernate’e göre daha yeni gelişen bir teknoloji olduğundan ortaya çıkabilecek hata payı NHibernate’e kıyasla daha fazladır[6].

Çok fazla sınıf yapısı içermesi gereken programlarda duruma göre XML mapping kullanmak daha uygun olabilmektedir[6].

ORM, NHibernate ve Fluent NHibernate kavramlarını gördükten sonra bundan sonra hangi konuları anlatmayı planladığıma bakalım.

1. Fluent NHibernate kullanımı ve Convention sınıfları.

2. Fluent NHibernate ile ilişkisel nesneler tasarlamak, Lazy Loading, Eager Loading.

3. Fluent NHibernate eşleme çeşitleri(mappings).

4. Fluent NHibernate CRUD işlemleri.

5. HQL(Hibernate Query Language).

6. Fluent NHibernate ile kullanıcı tanımlı tipler kullanmak.

7. Fluent NHibernate Automapping.

8. Convention sınıflarının yeniden yazılması.

9. Kalıtımsal eşleme.

Bu haftalık anlatacaklarım bu kadar, bir sonraki yazımda sizlere Fluent NHibernate kullanımı ve Convention sınıflarından bahsedeceğim. Şimdilik görüşmek üzere, hoşçakalın..


Kaynaklar


[1] ORM Nedir, http://www.cagataybulut.com/2013/07/orm-nedir.html, Şubat 21, 2015.

[2] ORM nedir ve ne zaman kullanma(ma)lıyız,  http://www.barisdere.com/2010/12/orm-nedir-ve-ne-zaman-kullanmamaliyiz-2/, Şubat 21, 2015.

[3] Hibernate, NHibernate Nedir, http://tanertemelce.blogspot.com.tr/2013/01/hibernate-nhibernate-nedir.html, Şubat 23, 2015.

[4] Yeni yazı disizi: NHibernate, http://b.zor.lu/yeni-yazi-disizi-nhibernate/, Şubat 23, 2015.

[5] NHibernate’e Başlama Klavuzu, http://www.tahircakmak.com/2008/05/nhibernatee-baslama-klavuzu_20.html, Şubat 22, 2015.

[6] NHibernate mappings using xml, attributes, and Fluent NHibernate, http://www.davesquared.net/2008/09/nhibernate-mappings-using-xml.html, Şubat 24, 2015.

[7]FluentNHibernate NhibernateGiriş-1,http://bilgehanyildiz.com/2011/11/10/fluentnhibernatenhibernategiris1/, Şubat 24, 2015.

[8] Fluent NHibernate introduction and quick start guide
, http://marekblotny.blogspot.com.tr/2008/12/fluent-nhibernate-introduction-and.html, Şubat 22, 2015.

[9] NHibernate for Entity Framework Developers: Part 1 – Fluent NHibernate, http://weblogs.asp.net/manavi/nhibernate-for-entity-framework-developers-part-1-fluent-nhibernate, Şubat 26, 2015.

Hiç yorum yok:

Yorum Gönder