Bilindiği üzere tüm veritabanlarının veri sorgulamak için birbirlerine benzer sorgulama dili vardır(Mssql için T-SQL, oracle için PL-SQL gibi). Hibernate ortamında veritabanından bağımsız düşünüldüğü için bu sorgulama dilleri arasındaki farklılığı ortadan kaldırmak amacıyla hibernate yapısal sorgulama dili(Hibernate Query Language) kullanılmaktadır. Hibernate yazılan HQL'i değerlendirip kullanılan veritabanına uygun dile dünüştürerek kullanır. Bu nedenle eğer HQL kullanarak daha esnek bir şekilde sorgulama yapmak istiyorsak bu dili öğrenmek icab ediyor. Aynı işlevi Criteria kullarak da belirtebiliyoruz. Ancak bu başka bir yazı konusudur. Bu yazıda HQL'in temel işlevlerini değerlendiriyor olacağım.
More...
5acb0a9d-84ba-4328-8b44-a4cf3efdd4b5|2|2.5
Merhabalar, NHibernate ile geliştirilen uygulamalarda veritabanından bağımsız çalışma yani herhangi bir veritabanına özel tipleri kullanamama durumundan dolayı özel tipler tanımlama gereği duyulmaktadır. Bu örneği daha iyi açıklayabilmek için Enumaration tipli alanların kullanımında yaşanan problem ve problemin çözümü hakkında bahsederek yazıya devam etmeyi uygun görüyorum.
Daha önceki yazılarda bir sınıfın Map edilme işlemine yönelik anlatımları gerçekleştirdim. Tabiki bazı özel durumlardan hemen bahsetmek uygun değildi. İlerledikce istisna durumları incelemek ve anlamak daha da kolaylaşıyor olacaktır.
Herşeyden önce Fluent NHibernate ile herhangi bir veritabanını kullanıldığı düşünülerek çalışılmalıdır. Yazacağımız kodun tamamı nesneye yönelik olması gerektiğinden nesne yönelimli kodlama önemli bir yer tutmaktadır.
More...
4c3f44e9-6d9e-4d15-90f9-30c526a7ce44|1|5.0
Daha önceki örneklerde Fluent NHibernate i her seferinde tek bir sınıf ile kullandık(Öğrenci sınıfı) bu örnekte ise birbiri ile ilişkisi olan iki farklı sınıf tasarlayıp nasıl Map edileceğine deyiniyor olacağım. Örneği yine öğrenci sınıfını kullanarak anlatacağım ve bu sefer Sınıf adında başka bir sınıfımız daha olacak. Böylelikle aralarındaki ilişkiyi kurarak ilişkisel nesneleri de anlamaya çalışıyor olacağız.
Genel olarak ifade etmem gerekirse her öğrencinin bir sınıfının ve her sınıfında öğrencileri olduğunu kabul ederek iki sınıfı da tasarladığımı söyleyebilirim. Böylelikle aşağıdaki öğrenci ve sınıf nesnelerini tanımlayabilirim.
More...
8c4d1a59-96a3-4838-9c34-133956c6997f|2|5.0
Merhabalar, bu yazıyı okumadan önce şu yazıyı okumanızı tavsiye eder ve söze böylelikle başlarım. :) Bilindiği üzere NHibernate kendine has HQL diye bir sorgulama diline sahiptir. Bu sorgulama dilini öğrenmek yerine ben linq le gayet iyiydim diyenler için NHibernate.Linq projesi geliştirilmiş. Kullanımına dair küçük bir örnek:
session.Linq<Ogrenci>().ForEach(o => Console.WriteLine(o.AdiSoyadi));
More...
ed7220b1-c863-49e8-a595-29940e585286|1|5.0
Merhabalar, NHibernate hakkında daha önce de yazmıştım. Bu yazıda asp.net ile birlikte NHibernate'in etkili bir şekilde kullanımına değiniyor olacağım. NHibernate'in sağladığı özelliklerden faydalanarak performanslı bir uygulama geliştirmemiz gerekiyor. Bu yazı klasik kullanımdan ziyade veri tabanı bağlantısının önemiyle alakalı bilgiler içeriyor.
NHibernate de Session kavramı önemli bir yer tutuyor. Veritabanı ile konuşma işlemleri için Session nesnesi kullanıyor. Bu nesne asp.net de bulunan Session nesnesi ile aynı isimdedir. İki nesneyi birbirine karıştırmamak gerekekir. NHibernate database ile konuşurken Session nesnesinin OpenSession() ile açıklması gerekiyor. Arkaplanda veritabanı ile alakalı bağlantı kuruluyor ve istediğimiz işlemleri(ekle, sil gibi) gerçekleştirmemize olanak sağlıyor.
ASP.NET ile ado.net yapısı için bağlantı yönetimine dayalı farklı bir çok yaklaşım vardır. Klasik yöntem her bir sorgu için bağlantının açılıp kapanmasına dayalıdır. Bu yazıda anlatacağım durum ise NHibernate'in OpenSession() yordamını sayfanın çağırıldığı andan tamamlanana kadar Session nesnesinin açık kalmasına dayalıdır. Bu yapıya göre istemci herhangi bir asp.net sayfasını çağırdığında veritabanı için oturum oluşturulur. Sayfa içindeki tüm db işlemleri bu oturum ile(yeni bir oturum oluşturmadan) gerçekleştirilir. Ve oturum sonlandırılır.
More...
46bc9d60-261e-4334-84aa-40a9a0a69f02|1|5.0
Daha önceki yazımda bahsettiğim gibi korkutucu yazıların aksine basit örneklerle devam etmeyi uygun görüyorum. Bu yazıda NHibernate ile basit bir veri yapısını nasıl modeller ve kullanırız sorusuna yanıt arıyoruz diyelim.
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? sorusunu soranlardan olarak yaptığım araştırma sonucunda Fluent NHibernate'i keşfettim. Bu yazıda Fluent NHibernate ile ilgili örnekler üzerinden devam edelim.
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.
<?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>
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
Öğ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);
Map(x => x.AdiSoyadi);
Map(x => x.DogumTarihi);
}
}
}
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()
{
Configuration configuration = new Configuration();
configuration.Configure("DatabaseConfiguration.xml"); // Veritabanı ayarlarını oku
return Fluently.Configure(configuration)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf())
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
static void BuildSchema(Configuration config)
{
new SchemaExport(config).Create(false, true);
}
}
}
Aşağıdaki videoda biraz daha açıklama çalıştım. Kafanız karıştıysa ve biraz daha karışsın istiyorsanız izleyin :)
d6bf885d-206e-4e44-9c71-9a9340cc1341|4|5.0