5 Nisan 2015 Pazar

Fluent NHibernate CRUD İşlemleri


Herkese merhabalar.

   Bugün sizlere Fluent NHibernate'in temel konusu olan CRUD işlemlerinden bahsedeceğim. Bu işlemleri gerçekleştirmeyi öğrendiğinizde Fluent NHibernate'i daha iyi kavramaya başlayacağınızı fark edeceksiniz. Gelin hep birlikte aşağıdaki örneğimiz ile bu işlemleri anlayalım.

   Örneğimizde teknoloji isimli bir veritabanımız olacak. Bu veritabanımızda, Marka, Telefon ve Televizyon tablolarını oluşturup bunlar üzerinde okuma, kayıt ekleme, kayıt silme ve kayıt güncelleme işlemlerini gerçekleştireceğiz.

   Önceki yazımda bahsettiğim şekilde gerekli dll dosyalarımızı projemize ekleyelim.



   Solution explorer'ımıza aşağıdaki şekilde uygun klasörlerin altında sınıflarımızı  oluşturalım.

   Örneğimizde; iki teknolojik cihaz ve bunların markaları üzerinden gideceğiz. Telefonun marka ile ve Televizyonun marka ile many-to-one ilişkisi vardır. Şöyle ki; bir telefonun bir markası var iken bir marka birden fazla telefona hatta farklı televizyon gibi telefondan farklı cihazların markası olabilmektedir.


Marka.cs


 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
 using System.Threading.Tasks;  
 namespace TelefonFluentHibernate.Entites  
 {  
   class Marka  
   {  
     public virtual int MarkaId { get; set; }  
     public virtual string MarkaAd { get; set; }  
   }  
 }  

Telefon.cs


 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
 using System.Threading.Tasks;  
 namespace TelefonFluentHibernate.Entites  
 {  
   class Telefon  
   {  
     public virtual int telefonId{get; set;}  
     public virtual string telefonAd { get; set;}  
     public virtual string telefonRenk { get; set; }  
     public virtual int telefonFiyat { get; set; }  
     public virtual Marka telefonMarka { get; set; }  
   }  
 }  

Televizyon.cs


 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
 using System.Threading.Tasks;  
 namespace TelefonFluentHibernate.Entites  
 {  
   class Televizyon  
   {  
     public virtual int televizyonId { get; set; }  
     public virtual string televizyonAd { get; set; }  
     public virtual string televizyonRenk { get; set; }  
     public virtual int televizyonFiyat { get; set; }  
     public virtual Marka televizyonMarka { get; set; }  
   }  
 }  

MarkaMap.cs

 using FluentNHibernate.Mapping;  
 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
 using System.Threading.Tasks;  
 using TelefonFluentHibernate.Entites;  
 namespace TelefonFluentHibernate.Mapping  
 {  
   class MarkaMap : ClassMap <Marka>  
   {  
     public MarkaMap()  
     {  
       Id(x => x.MarkaId);  
       Map(x => x.MarkaAd);  
       Table("Marka");  
     }  
   }  
 }  

TelefonMap.cs

 using FluentNHibernate.Mapping;  
 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
 using System.Threading.Tasks;  
 using TelefonFluentHibernate.Entites;  
 namespace TelefonFluentHibernate.Mapping  
 {  
   class TelefonMap : ClassMap <Telefon>  
   {  
     public TelefonMap()  
     {  
       Id(x => x.telefonId);  
       Map(x => x.telefonAd);  
       Map(x => x.telefonFiyat);  
       Map(x => x.telefonRenk);  
       References(x => x.telefonMarka).Column("MarkaId");  
       Table("Telefon");  
     }  
   }  
 }  

TelevizyonMap.cs

 using FluentNHibernate.Mapping;  
 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
 using System.Threading.Tasks;  
 using TelefonFluentHibernate.Entites;  
 namespace TelefonFluentHibernate.Mapping  
 {  
   class TelevizyonMap : ClassMap <Televizyon>  
   {  
     public TelevizyonMap()  
     {  
       Id(x => x.televizyonId);  
       Map(x => x.televizyonAd);  
       Map(x => x.televizyonFiyat);  
       Map(x => x.televizyonRenk);  
       References(x => x.televizyonMarka).Column("MarkaId");  
       Table("Televizyon");  
     }  
   }  
 }  

NHibernateHelper.cs

 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
 using FluentNHibernate.Cfg;  
 using FluentNHibernate.Cfg.Db;  
 using NHibernate;  
 using NHibernate.Tool.hbm2ddl;  
 using TelefonFluentHibernate.Entites;  
 namespace TelefonFluentHibernate  
 {  
   public class NHibernateHelper  
   {  
     private static ISessionFactory _sessionFactory;  
     private static ISessionFactory SessionFactory  
     {  
       get  
       {  
         if (_sessionFactory == null)  
           InitializeSessionFactory();  
         return _sessionFactory;  
       }  
     }  
     private static void InitializeSessionFactory()  
     {  
       _sessionFactory = Fluently.Configure()  
         .Database(MySQLConfiguration.Standard  
                .ConnectionString(  
                  @"Server=localhost; Port=3306;Database=teknoloji; Uid=root; Pwd=;")  
                .ShowSql()  
         )  
         .Mappings(m =>  
              m.FluentMappings  
                .AddFromAssemblyOf<Program>())  
         .ExposeConfiguration(cfg => new SchemaExport(cfg)  
                         .Create(true, true))  
         .BuildSessionFactory();  
     }  
     public static ISession OpenSession()  
     {  
       return SessionFactory.OpenSession();  
     }  
   }  
 }  

Program.cs

 using NHibernate;  
 using NHibernate.Criterion;  
 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
 using TelefonFluentHibernate.Entites;  
 namespace TelefonFluentHibernate  
 {  
   class Program  
   {  
     static void Main(string[] args)  
     {  
       var telefonNNote4 = new Telefon  
       {  
         telefonAd = "note 4",  
         telefonFiyat = 500,  
         telefonRenk = "beyaz"  
       };  
       var televizyon = new Televizyon  
       {  
         televizyonAd = "tv1",  
         televizyonRenk = "siyah",  
         televizyonFiyat = 1000  
       };  
       var televizyon2 = new Televizyon  
       {  
         televizyonAd = "tv2",  
         televizyonRenk = "beyaz",  
         televizyonFiyat = 1430  
       };  
       var markaSamsung = new Marka  
       {  
         MarkaAd = "samsung"  
       };  
       var markaApple = new Marka  
       {  
         MarkaAd = "apple"  
       };  
       //Create kısmı. Telefon Ekle  
       Ekle<Telefon>(telefonNNote4);  
       //Televizyon ekle  
       Ekle<Televizyon>(televizyon);  
       Ekle<Televizyon>(televizyon2);  
       //Marka ekle  
       Ekle<Marka>(markaSamsung);  
       Ekle<Marka>(markaApple);  
       //Update kısmı. Telefonu güncelle  
       telefonNNote4.telefonMarka = markaSamsung;  
       Guncelle<Telefon>(telefonNNote4);  
       //Televizyonu güncelle  
       televizyon.televizyonMarka = markaApple;  
       televizyon.televizyonRenk = "pembe";  
       Guncelle<Televizyon>(televizyon);  
       televizyon2.televizyonMarka = markaApple;  
       Guncelle<Televizyon>(televizyon2);  
       //Read kısmı   
       Marka marka = Oku("apple");  
       Console.WriteLine("Okunan satir: "+marka.MarkaId+" - "+marka.MarkaAd);  
       //Delete kısmı. Televizyon sil  
       Sil<Televizyon>(televizyon);  
     }  
     private static void Ekle<T>(T yeniKayit)  
     {  
       using (var session = NHibernateHelper.OpenSession())  
       {  
         using (var transaction = session.BeginTransaction())  
         {  
           session.Save(yeniKayit);  
           transaction.Commit();  
           Console.WriteLine("Yeni kayıt eklendi.");  
         }  
       }  
     }  
     private static void Guncelle<T>(T guncelKayit)  
     {  
       using (var session = NHibernateHelper.OpenSession())  
       {  
         using (var transaction = session.BeginTransaction())  
         {  
           session.SaveOrUpdate(guncelKayit);  
           transaction.Commit();  
           Console.WriteLine("Kayit güncellendi. ");  
         }  
       }  
     }  
     private static void Sil<T>(T silKayit)  
     {  
       using (var session = NHibernateHelper.OpenSession())  
       {  
         using (var transaction = session.BeginTransaction())  
         {  
           session.Delete(silKayit);  
           transaction.Commit();  
           Console.WriteLine("Kayit silindi. ");  
         }  
       }  
     }  
     private static Marka Oku(string markaAdi)  
     {  
       using (var session = NHibernateHelper.OpenSession())  
       {  
         Marka markaQuery = (from markaNesnesi in session.QueryOver<Marka>()  
                   where markaNesnesi.MarkaAd == markaAdi  
                   select markaNesnesi).SingleOrDefault();  
         /*IQuery q2 = session.CreateQuery("from Marka WHERE markaAd='" + markaAdi + "';");  
         var markaListesi = q2.List<Marka>();*/  
         Console.WriteLine("Uygun satır bulundu: " + markaQuery.MarkaAd);  
         return markaQuery;  
       }  
     }  
   }  
 }  

Konsol Çıktısı

 alter table telefon drop foreign key FKA4173F7AC8A29C0D  
 alter table Televizyon drop foreign key FK7ADB542AC8A29C0D  
   drop table if exists Marka  
   drop table if exists telefon  
   drop table if exists Televizyon  
   create table Marka (  
     MarkaId INTEGER NOT NULL AUTO_INCREMENT,  
     MarkaAd VARCHAR(255),  
     primary key (MarkaId)  
   )  
   create table telefon (  
     telefonId INTEGER NOT NULL AUTO_INCREMENT,  
     telefonAd VARCHAR(255),  
     telefonFiyat INTEGER,  
     telefonRenk VARCHAR(255),  
     MarkaId INTEGER,  
     primary key (telefonId)  
   )  
   create table Televizyon (  
     televizyonId INTEGER NOT NULL AUTO_INCREMENT,  
     televizyonAd VARCHAR(255),  
     televizyonFiyat INTEGER,  
     televizyonRenk VARCHAR(255),  
     MarkaId INTEGER,  
     primary key (televizyonId)  
   )  
   alter table telefon  
     add index (MarkaId),  
     add constraint FKA4173F7AC8A29C0D  
     foreign key (MarkaId)  
     references Marka (MarkaId)  
   alter table Televizyon  
     add index (MarkaId),  
     add constraint FK7ADB542AC8A29C0D  
     foreign key (MarkaId)  
     references Marka (MarkaId)  
 NHibernate: INSERT INTO telefon (telefonAd, telefonFiyat, telefonRenk, MarkaId)  
 VALUES (?p0, ?p1, ?p2, ?p3);?p0 = 'note 4' [Type: String (6)], ?p1 = 500 [Type:  
 Int32 (0)], ?p2 = 'beyaz' [Type: String (5)], ?p3 = NULL [Type: Int32 (0)]  
 NHibernate: SELECT LAST_INSERT_ID()  
 Yeni kayıt eklendi.  
 NHibernate: INSERT INTO Televizyon (televizyonAd, televizyonFiyat, televizyonRen  
 k, MarkaId) VALUES (?p0, ?p1, ?p2, ?p3);?p0 = 'tv1' [Type: String (3)], ?p1 = 10  
 00 [Type: Int32 (0)], ?p2 = 'siyah' [Type: String (5)], ?p3 = NULL [Type: Int32  
 (0)]  
 NHibernate: SELECT LAST_INSERT_ID()  
 Yeni kayıt eklendi.  
 NHibernate: INSERT INTO Televizyon (televizyonAd, televizyonFiyat, televizyonRen  
 k, MarkaId) VALUES (?p0, ?p1, ?p2, ?p3);?p0 = 'tv2' [Type: String (3)], ?p1 = 14  
 30 [Type: Int32 (0)], ?p2 = 'beyaz' [Type: String (5)], ?p3 = NULL [Type: Int32  
 (0)]  
 NHibernate: SELECT LAST_INSERT_ID()  
 Yeni kayıt eklendi.  
 NHibernate: INSERT INTO Marka (MarkaAd) VALUES (?p0);?p0 = 'samsung' [Type: Stri  
 ng (7)]  
 NHibernate: SELECT LAST_INSERT_ID()  
 Yeni kayıt eklendi.  
 NHibernate: INSERT INTO Marka (MarkaAd) VALUES (?p0);?p0 = 'apple' [Type: String  
  (5)]  
 NHibernate: SELECT LAST_INSERT_ID()  
 Yeni kayıt eklendi.  
 NHibernate: UPDATE telefon SET telefonAd = ?p0, telefonFiyat = ?p1, telefonRenk  
 = ?p2, MarkaId = ?p3 WHERE telefonId = ?p4;?p0 = 'note 4' [Type: String (6)], ?p  
 1 = 500 [Type: Int32 (0)], ?p2 = 'beyaz' [Type: String (5)], ?p3 = 1 [Type: Int3  
 2 (0)], ?p4 = 1 [Type: Int32 (0)]  
 Kayit güncellendi.  
 NHibernate: UPDATE Televizyon SET televizyonAd = ?p0, televizyonFiyat = ?p1, tel  
 evizyonRenk = ?p2, MarkaId = ?p3 WHERE televizyonId = ?p4;?p0 = 'tv1' [Type: Str  
 ing (3)], ?p1 = 1000 [Type: Int32 (0)], ?p2 = 'pembe' [Type: String (5)], ?p3 =  
 2 [Type: Int32 (0)], ?p4 = 1 [Type: Int32 (0)]  
 Kayit güncellendi.  
 NHibernate: UPDATE Televizyon SET televizyonAd = ?p0, televizyonFiyat = ?p1, tel  
 evizyonRenk = ?p2, MarkaId = ?p3 WHERE televizyonId = ?p4;?p0 = 'tv2' [Type: Str  
 ing (3)], ?p1 = 1430 [Type: Int32 (0)], ?p2 = 'beyaz' [Type: String (5)], ?p3 =  
 2 [Type: Int32 (0)], ?p4 = 2 [Type: Int32 (0)]  
 Kayit güncellendi.  
 NHibernate: SELECT this_.MarkaId as MarkaId0_0_, this_.MarkaAd as MarkaAd0_0_ FR  
 OM Marka this_ WHERE this_.MarkaAd = ?p0;?p0 = 'apple' [Type: String (5)]  
 Uygun satır bulundu: apple  
 Okunan satir: 2 - apple  
 NHibernate: DELETE FROM Televizyon WHERE televizyonId = ?p0;?p0 = 1 [Type: Int32  
  (0)]  
 Kayit silindi.  

    Yukarıdaki örnekte kodu yorumları ile birlikte çok rahat anlayacaksınız. Sadece üç tane entity ve üç tane mapping sınıfımız var ve bunlar üzerinde; ekleme, okuma, güncelleme ve silme işlemlerini gerçekleştiriyoruz. Dikkat etmeniz gereken özellikle önemli gördüğüm noktalara değinmek istiyorum. Marka ile Telefon veya Marka ile Televizyon arasındaki ilişki many-to-one olduğundan dolayı; referans olarak many olan tarafta yani Telefonda ve Televizyonda Marka'yı belirtmek zorundayız. "References" kullanımını many olan kısımda yazdığımızı üzerine basa basa söylemek istiyorum aksi taktirde durduk yere hatalar ile karşılaşırsınız. İkinci olarak söylemek istediğim; Marka tipindeki Oku metodu ile markayı okuduğumuz zaman karşımıza çıkan ilk kaydı döndürmek istersek, aşağıdaki şekilde SingleOrDefault yapısını kullanmalıyız.

 Marka markaQuery = (from markaNesnesi in session.QueryOver<Marka>()  
                   where markaNesnesi.MarkaAd == markaAdi  
                   select markaNesnesi).SingleOrDefault();  

   Eğer aradığımız marka adına sahip tüm nesneleri döndürmek istiyorsak, aşağıdaki kod parçasının yardımı ile okuma yapmalıyız.

 IQuery q2 = session.CreateQuery("from Marka WHERE markaAd='" + markaAdi + "';");  
         var markaListesi = q2.List<Marka>();  

   Bugünlük anlatacaklarım bu kadar. Herkese bol kodlu günler.

Referanslar

[1] Create, read, update and delete, http://en.wikipedia.org/wiki/Create,_read,_update_and_delete, Nisan 2, 2015.

[2]Simplify Database Operations with Generic Fluent NHibernate, http://www.codeproject.com/Articles/380022/Simplify-Database-Operations-with-Generic-Fluent-N, Nisan 3, 2015.

[3]Tutorial on NHibernate and FluentNhibernate,  https://thehelios.wordpress.com/2011/07/11/tutorial-on-nhibernate-and-fluentnhibernate/, Nisan 4, 2015.                        


Hiç yorum yok:

Yorum Gönder