Nhibernate entity framework,llblgen gibi bir orm tooludur.FluentNHibernate ise nhibernatedeki xml olarak yapılan nesnelerin mapping işlemini classlarda daha kolay bir şekilde yapmamıza olanak sağlayan bir yapıdır.
Nhibernate ve FluentNHibernate kullanmak için bazı dllleri alıp kendi projenize eklemek yeterlidir.Ayrıca bir program kurmaya vs gerek yoktur
FluentNHibernate.dll
NHibernate.dll...
Gibi bir kaçtane dlli
http://fluentnhibernate.org/ adresinden indirerek kendi projenize referans olarak ekleyin.Fluent Nhibernatele beraber xml olarak yazacağımız mapping sınıfları kodda yapabiliyoruz.Ancak stored procedure vs kullanmak istersek bu işlemleri gene xml ile yapmak gerekmektedir
Öncelikle Veritabanımızdaki tablolarımızı modelliyoruz
Önce
Önce Person ve PersonType ları modelliyoruz.Propertyleri virtual yapmamızın amacı nhibernatedeki lazy load özelliğini kullanabilmek içindir.Burdaki her Person bir tipte alabileceği için tek nesnede.PersonTypeler ise birden fazla Personda olacağı için liste şeklinde tasarlandı
Kod:
public class Person
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual int PersonTypeID { get; set; }
public virtual PersonType PersonTypes { get; set; }
}
public class PersonType
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual IList<Person> Persons { get; set; }
}
Fluent Nhibernate ile normal nhibernate xml de yaptığımız mapping işlemini kodla yapabiliyoruz.Map sınıflarını kullanabilmek için ise namespace ekliyoruz
using FluentNHibernate.Mapping;
Map classımızı mutlaka ClassMap den türemelidir ve içine generic olarak map etmek istediğimiz nesneyi yazıyoruz.
Diğer dikkat edilmesi gereken nokta ise ilişkiler kısmıdır.
Bizim senaryomuz gereği her Person bir tipi olacaktır.Dolayısıyla person nesnesindeki PersonTypeID alanı esasında bir foreign keydir
Bu ilişkiyide References komutuyla yapıyoruz.Ancak PersonTypeMap classında böyle bir foreign key yok ancak bunun personla ilişkisini belirtmek için HasMany komutunu kullanıyoruz
Kod:
public class PersonMap:ClassMap<Person>
{
public PersonMap()
{
Table("Person");
Schema("Common");
Id(x => x.ID);
Map(x => x.Name);
Map(x => x.PersonTypeID);
References(x => x.PersonTypes).Column("PersonTypeID").ReadOnly();//ReadOnly demezsek bu alan insertte soruna neden oluyor
}
}
public class PersonTypeMap : ClassMap<PersonType>
{
public PersonTypeMap()
{
Table("PersonType");
Schema("dbo");
Id(x => x.ID);
Map(x => x.Name);
HasMany<Person>(x => x.Persons);
}
}
Daha sonra ise bir tane Helper Class yazarak SessionFactory mizi fluent nhibernate le uyumlu olacak şekilde oluştuyoruz
GetSessionFactory() metodundaki
.FluentMappings.AddFromAssemblyOf<PersonTypeMap>())
addfromassemblyof komutu ile de mappingleri yüklüyoruz ancak oluşturulan xml dosyalarını da bir yere almak istersek bu kodun sonuna ExportTo komutunu koyarak mappinglerin xml hallerinide görebiliriz
Kod:
.Mappings(m => m.FluentMappings.AddFromAssembly(assembly)
.ExportTo(@"C:\your\export\path")
public class NHibernateHelper
{
private static ISessionFactory _SessionFactory;
public static ISessionFactory SessionFactory
{
get
{
if (_SessionFactory == null)
//InitializeSessionFactory();
_SessionFactory = GetSessionFactory();
return _SessionFactory;
}
}
public static ISessionFactory GetSessionFactory()
{
return Fluently.Configure()
.Database(
MsSqlConfiguration.MsSql2005
.ConnectionString(c => c
.Database("TelefonRehberi")
.Server(".")
.Password("1234")
.Username("sa")
)
)
.Mappings(m => m
.FluentMappings.AddFromAssemblyOf<PersonTypeMap>())
.BuildSessionFactory();
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
//Daha sonra Formumuzdan aşağıdaki gibi bir yöntemle ilk sorgumuzu yazabiliyoruz
private void button2_Click(object sender, EventArgs e)
{
var session = NHibernateHelper.OpenSession();
IList<Person> ab = session.CreateCriteria(typeof(Person)).List<Person>();
MessageBox.Show(ab[1].PersonTypes.Name);
}
Yukarıdaki sorgu Person tablosundaki bütün kayıtları alarak ekrana gelen Person nesnesin PersonType ‘ın adını bize verecektir.