Merhabalar,
Bu yazımızda veritabanı işlemlerini için,ilişkisel veritabanları ile nesne yönelimli diller arasında veri alışverişinde köprü görevi gören bir diğer tool olan Fluent Nhibernate ile küçük bir çalışma yapacağız.Daha önce bir diğer tool linq to sql ile ilgili örnek paylaşımı yapmıştık bkz-> ..Bu orm aracı ile yazdığımız kod u ms sql server üzerinde de,mysqlde de çalıştırabiliriz ki bu da platfrom bağımsız olduğunu gösterir.
C sharp ile çalışırken .net altında bulunan ado.net kütüphanesi yerine kullanabileceğimiz fluent nhibernate aracı ile ilgili temel bilgilere buradan ulaşabiliriz.Mantık olarak veritabanı tablolarının uygulama tarafında sınıflar aracılığı ile tutulmasını sağlar.Veri tabanındaki alanlarda property olarak tanımlanır.Sınıfları yazdıktan sonra da bir de classlar ile mapping işlemi gerçekleştriyoruz.Mappingde de hangi property hangi tablonun hangi alanına referans ettiğini belirtiyoruz.Daha sonra da bu nesneler üzerinden orm tool u ile veritabanı işlemlerini sql komutu yazmadan gerçekleştirebiliyor olacağız.
Örnek uygulama için Visual Studio ortamında bir console application açıyoruz öncelikle.Fluent Nhibernate i kullanabilmek içinde referanslara sağ tık manage nuget packages ı açıyoruz.Arama kısmına fluentnhibernate yazıp gelen tool u yüklüyoruz projemize.
Daha sonrada basit bir veritabanı oluşturuyoruz ;
- Başlık tablomuzda başlığı açacak olanın id sini,açılma zamanını ve başlığın adını tutuyoruz.
- Entry tablomuzda ise girilen entrylerin zamanını ve hangi başlık a ve üyeye ait olduğu bilgisini tutuyoruz.
- Uye tablomuzda ise isimlerin yer aldığı bir kolonumuz bulunmakta.
Veritabanını da oluşturduktan sonra projemizde entityler için bir Model klasörü açıyoruz.Model in altına da Title,Entry ve Member isminde 3 tane sınıf açıyoruz.
- Member
Member sınıfı için property leri db deki alanlara denk gelecek şekilde hazırladıktan sonra virtual olarak işaretlemeyi unutmuyoruz,fluent nhibernate bu sayede bunların üzerinden işlem yapacaktır.Daha sonra da bu member sınıfına bağlı title ve entry lerin listelerinin tutulacağı listeleri belirtmemiz gerekiyor.Dışarıdan kullanmak istediğimizde sınıfın contructor içinde yeni bir nesne ürettiriyoruz.Member oluştururken dışarıdan constructor ile bu sınıfı kurabilmek için üye adı olarak alıp içerdekine eşitleyebiliriz.
- Title
Title sınıfımızda da property leri referansları ve entrilere ait listelerin tutulacağı property i belirttikten sonra yine constructor method içinde bir instance oluşturulmasını sağlıyoruz.
- Entry
Entry sınıfında da property ve referans nesnelerini oluşturuyoruz ve map’leme diye tabir edilen modelleri db ye bağlama işlemlerini yazacağımız sınıfları yazıyoruz.
- MemberMap
ClassMap isimli genecik sınıf miras alınır,böylece fluent nhibernate mapping işlemini içinde gönderdiğimiz sınıf a göre yapmaktadır.Mapping işlemini constructor method içinde yazıyoruz,Id olarak neyi göndereceğimiz yazdıktan sonra diğer alanlar için map fonksiyonunu kullanıyoruz.ForeignKey bağlantıları içinde eğer sınıfında id si başka bir sınıfta kullanılacaksa hasmany fonksiyonu kullanarak id yi tanımlıyoruz.İçerisinde de hangi listeye (ki burada Title sınıfınınki kullanıldı) gönderileceği ve hangi kolon isimiyle bulunacağını belirtiyoruz.Inverse komutu ise id ler member altındaki başlık nesnelerine de aktarılacak.Cascade.AllDeleteOrphan() fonksiyonu ise foreign key bağlantısı içinde olan bir verinin silinmesi durumunda bağlı olduğu diğer başlıkları da silmeyi sağlar.Yani bir üye uçurulursa yazdığı entriler in ve başlıkların silinmesini sağlıyoruz.
- TitleMap
Title sınıfının map’lenme işlemi de benzer şekilde yapılmaktadır.Ek olarak referans olarak aldığı MemberID vardır.Bu şekilde hangi başlık kim tarafından yazılmış görebiliyor olacağız.
- EntryMap
ForeignKey olarak gönderilen kolon isimlerinin diğer sınıfta referans olarak alındığında aynı isimde olmasını sağlıyoruz.Entry sınıfımız içinde map’leme işlemini resimdeki gibi tanımladıktan sonra uygulamamızın program.cs dosyası içerisinde artık işlemlerimizi yaptırtmaya başlayabiliriz.
- Program.cs
İlk olarak connectionString bağlantımız için bir property tanımlıyoruz.ISessionFactory interface ini kullanarak session başlatma işlemlerimizi tanımlıyoruz sırasıyla. fluent nhibernate için database bağlantısını tanımladıktan sonra program sınıfının assembly si üzerinden map’liyoruz.Class map leri bulup veritabanını oluşturacaktır bu şekilde.
Uygulamayı console olarak hazırlamasaydım sanırım daha iyiydi ama az çok nasıl kullanıldığını biliyor olsak yeterli.Düşündüğüm şeyi yaparken biraz kısıtladı.
Main methodu içerisinde hazırladığımız kod yapısıyla ;
Öncelikle aldığı isim ve şifre parametreleri ile db dekini karşılaştırıp varsa 2.aşama olan başlık açtırtmaya ve de yine o başlık var ise entri girmeye olanak veriyor.
Eğer girilen üye kaydı db de yoksa kayıt ettirip işlemi bitiriyor,tekrar uygulamayı çalıştırdığımızda kayıtlı olan üye ile giriş yapıp başlık açtırtıyoruz ve yine işlemi tamamlattırıp tekrar çalıştırdığımızda kayıtlı kullanıcı ile giriş yapıp kayıtlı olan başlığı girip entri girmemize olanak sağlıyor şuan için,daha iyisi tabiki yapılabilir dediğim gibi yararlı olursa yine de ne mutlu bize :).
Son olarak uygulama sonrası ile ilgili bir kaç sonuç görseli paylaşacak olursak ;
- Uygulama Ekranı
- Veritabanı Ekranı
Kaynaklar
Bir sonraki yazımızda görüşmek üzere..