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