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 10:00:33(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.
Aralarında 1 – n ilişki olan varlıklarda child varlıkta parent kayda ilişkin bir Foreign Key tutarız.Dolayısıyla child varlığı ekleyeceğimiz zaman bu Foreign Key değerini vererek gerekli kayıt işlemini gerçekleştirmiş oluruz.Ancak bazı durumlarda parent kayıt eklenirken (Daha henüz databasede yaratılmadan) bu parent kayda bağlı child varlıkları eklemek ve bunların hepsini bir seferde database kayıt olmasını isteyebiliriz.Örnek olarak Bir Master Kayıt Kişi ve buna bağlı Telefonlar ikiside farklı varlıklar olarak düşünülürse kişiyi eklediğimiz anda telefonlarınıda eklemek istiyoruz ve bunuda database iki kere gitmeden tek bir save ile halletmek istiyoruz

Fluent Nhibernate de bunu yapabilmek için aşağıdaki adımlar izlenmelidir

Burada master entity PersonType ,child Entity Person olarak düşünülmüştür.Amaç Yeni bir persontype yaratırken buna bağlı personlarıda veritabanına ekleyebilmektir.

Birinci varlığımız PersonType içinde childları olan personları barındırıyor

Kod:

public class PersonType
    {
        public virtual int ID { get; set; }
        public virtual string Name { get; set; }
        public virtual ICollection<Person> Persons { get; set; }

       
    }





İkinci varlığımız(child olan) Person ise dikkat edilirse Foreign Keyini direkt int gibi alacak şekilde değil,nesne tabanlı olacak şekilde tasarlıyoruz.

Kod:

public partial class Person
    {
        public virtual int ID { get; set; }
        public virtual string Name { get; set; }
        public virtual PersonType PersonTypes { get; set; }
        

    }



Maplarimiz ise aşağıdaki şekilde tasarlıyoruz.Dikkat edilirse Fluent Nhibernate Giriş 2 deki basit mapleme mantığından farklı olarak artık İlişkili alanları nesne mantığında tutuyoruz.

Kod:

public PersonTypeMap() 
        {
            Table("PersonType");
            Schema("dbo");
            Id(x => x.ID);
            Map(x => x.Name);
            HasMany<Person>(x => x.Persons).Cascade.AllDeleteOrphan().KeyColumn("ID").Inverse().Table("PersonType");        
        }


public class PersonMap:ClassMap<Person>
    {
        public PersonMap() 
        {
            Table("Person");
            Schema("Common");
            Id(x => x.ID);
            Map(x => x.Name);
            References(x => x.PersonTypes).Column("PersonTypeID").Cascade.None();
            
        }
    }


Bundan sonra Parent – Child olarak tek bir seferde save yapabilmek için aşağıdaki gibi bir kod yazmak yeterli olacaktır.Aşağıdaki koddada görüldüğü üzere Sistem Admin Tipini yaratırken ona bağlı olarak Person varlığınıda yaratıyoruz.Bu işlemleride runtimede tek bir savede yaptığımız için mappinglerimizide nesne tabanlı çalışcak hale getiriyoruz.

Kod:


            var session = NHibernateHelper.OpenSession();
            PersonType p = new PersonType();
            p.Name = "Sistem Admin";
            p.Persons  = new Collection<Person>();
            Person p2 = new Person { Name = "Bilgehan Yıldız",PersonTypes=p};
            p.Persons.Add(p2);
            session.Save(p);



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.