logo
Welcome Guest! To enable all features please Giriş or Kayıt.

Bildirim

Icon
Error

Ayarlar
Son mesaja git Go to first unread
bilgehanyildiz  
#1 Gönderildi : 26 Şubat 2015 Perşembe 09:48:43(UTC)
bilgehanyildiz

Sıralama: Member

Gruplar: Registered
Katılan: 25.02.2015(UTC)
Mesajlar: 12
Turkey
Konum: İstanbul

2 Mesajına Toplam 2 Kere Teşekkür Edildi.
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

UserPostedImage

Ö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.


Bu konudaki kullanıcılar
Guest
Forumu Atla  
Bu foruma yeni konular postalayamazsınız.
Bu forumda ki konulara yeni posta gönderemezsiniz.
Bu forumdaki postalarınızı silemezsiniz.
Bu forumdaki postalarınızı düzenleyemezsiniz.
Bu forumda anketler yaratamazsınız.
Bu forumdaki anketlere oy veremezsiniz.