FLUENT NHIBERNATE DE PARENT-CHILD (MASTER- DETAIL) FORMATTA KAYIT EKLEME(SAVE YONTEMİ))

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

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.

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.

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.

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 yazı .NET kategorisine gönderilmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>