Makale Özeti

Fluent NHibernate'e giriş seviyesi niteliği taşıyan içerik.

Makale

Bilindiği üzere hibernate projesi java tarafında uzun süredir kullanılan en güçlü veritabanı erişim araçlarındandır. Object relational mapping aracı olarak koddan uzaklaşmadan veritabanı işlerimizi gerçekleştirme imkanı sunar. En önemli özelliklerinden birisi de veritabanından bağımsız çalışabilmesidir. Yani hibernate ile geliştirilmiş bir projede bağlantı bilgileri değiştirilerek farklı bir firmanın veritabanı ile çalışması sağlanabilir. Hibernate ile MSSQL üzerinde geliştirilmiş bir proje varsa oracle ya da mysql vb. veritabanları ile çalışan sürümünüz de büyük oranda elinizde demektir.

Hibernate projesini .net ortamında kullanabilmek adına açık kaynak geliştirilen NHibernate projesi ortaya çıkmıştır. Bu yazıda NHibernate ile basit bir veri yapısını nasıl modeller ve kullanırız sorusuna yanıt arıyoruz.

NHibernate'de geleneksel olarak veri yapıları xml dosyaları ile yapılıyor ancak sınıf temelli yazmamanın daha uygun olduğunu düşünüyorum. Örneğin bir öğrenci veri yapısında öğrenci no, adı, soyadı gibi alanların xml içinde tanımlanmasında kuşkusuz bir sorun yok ancak ayrıca bir öğrenci sınıfının yazılmasına da ihtiyaç duyuyor. Öyleyse neden xml ihtiyaç var ki? Bu yazıda Fluent NHibernate ile ilgili örnekler üzerinden devam ediyoruz.

Merhaba dünya projesi için izlenmesi gereken adımlar şöyle olmalı:

1) Fluent NHibernate'in son sürümü bakkaldan alınmalıdır. (İndir)
2) İndirilen NHibernate dll'leri bir güzel yıkanıp zipten çıkarılmalı ve projemize referans edilmelidir.
3) Konfigurasyon ile ilgili kodlar yazıldıktan sonra, öğrenci sınıfı ile ilgili kodlar yazılmalıdır.

NHibernate'i indirip referans ettikten sonra veritabanı ayarları için aşağıdaki xml dosyasını tanımlayalım.

[code:xml]

<?xml version="1.0" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">server=.;database=tb;integrated security=true;</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
  </session-factory>
</hibernate-configuration>

[/code]

Aşağıdaki kod ile ayarı okutalım:

var configuration = new Configuration();
configuration.Configure("DatabaseConfiguration.xml"); // Veritabanı ayarlarını oku
configuration.AddAssembly("NHibernate_HelloWorld"); // Hangi veri yapılarını okuyacağını anla

 


Xml kodlarının karmaşasından kurtulup nesneye daha çok yaklaşmak adına fluent nhibernate diyorum. Varolan sınıflarımızı fluent nhibarnate ile kullanmak(crud işlemlerinde) için ClassMap nesnesinden kalıtmamız gerekiyor. Bu nesne ilgili sınıfın property'lerinin database seviyesinde nasıl algılanması gerektiğini ve nasıl davranması gerektiği gibi bilgileri fluent nhibernate'e aktarmak için kullanılır.

 

Öğrenci sınıfını aşağıdaki gibi tanımlayalım:

 

namespace NHibernate_HelloWorld
{
    using System;
    using FluentNHibernate.Mapping;

    public class Ogrenci
    {
        public virtual int OgrenciId { get; set; }

        public virtual string AdiSoyadi { get; set; }

        public virtual DateTime DogumTarihi { get; set; }
    }

    public class OgrenciMap : ClassMap
    {
        public OgrenciMap()
        {
            Id(x => x.OgrenciId); // Primary key olarak kullan
            Map(x => x.AdiSoyadi); // Varsayılan ayarlarla tanımla: String tipinde tutulabilecek alan tanımlanır. MSSQL için nvarchar(50) gibi
            Map(x => x.DogumTarihi); // Varsayılan ayarlarla tanımla: DataTime tipinde olduğundan MSSQL tarafı DateTime
        }
    }
}

 

Konsol uygulamasına ait kodlama'da aşağıdaki gibi olsun:

 

using System;
using NHibernate.Cfg;
using NHibernate;
using FluentNHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;

namespace NHibernate_HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Program başldı");
            
            using (var sessionFactory = GetSessionFactory())
            {
                Console.WriteLine("Session Factory oluşturuldu");

                using (var session = sessionFactory.OpenSession())
                {
                    Console.WriteLine("Session oluşturuldu");

                    Ogrenci ogrenci = new Ogrenci();
                    ogrenci.AdiSoyadi = "Ömer Faruk ZORLU";
                    ogrenci.DogumTarihi = new DateTime(1987, 7, 27);

                    session.Save(ogrenci);
                    Console.WriteLine("Öğrenci kaydı eklendi");
                }
            }
                
        }

        static ISessionFactory GetSessionFactory()
        {
// Fluent NHibernate Configurasyon sınıfıdır, karıştırılmamalıdır.
Configuration configuration = new Configuration(); configuration.Configure("DatabaseConfiguration.xml"); // Veritabanı ayarlarını oku
// Fluent NHibernate'i configure eden kod.
return Fluently.Configure(configuration) .Mappings(m => m.FluentMappings.AddFromAssemblyOf()) // Mapping tanımlamalarının assembly seviyesinde(şuan kendisinde)dir .ExposeConfiguration(BuildSchema) // Map edilen sınıfların BuildSchema ile veritabanı karşılıklarını sağla. .BuildSessionFactory(); } static void BuildSchema(Configuration config) { new SchemaExport(config).Create(false, true); } } }

 

Böylelikle hibernate projesini fluent nhibernate farkı ile deneyimlemiş oluyoruz. Bu kodu sağlıklı bir şekilde çalıştırdıktan sonra DatabaseConfiguration.xml dosyasındaki veritabanı bağlantı bilgilerini değiştirdiğinizde örneğin mevcut mssql bağlantısı yerine MySql bilgilerini tanımlarsanız sorunsuz çalıştığını görmek keyifli olacaktır.

 

Faydalı olması dileğiyle