XPO ile O\R MAPPING -3

 Merhabalar, bu makale serimizde Object Relational Mapping kavramından ve DevExpress ürün ailesine ait XPO ile temel veritabanı işlemlerimizi nasıl yapabileceğimizden bahsedeceğiz.

İlişkiler:

Veritabanı uygulamalarımızda her zaman tek tabloyla çalışmadığımız için XPO’da da birden fazla tabloyla çalışmamızı ve aralarında ilişkiler kurmamızı sağlayan yapılar var. XPO’da tablolar arası ilişki kurmak istediğimizde bunu bu tablolara ait sınıflarımızı oluştururken Association anahtar sözcüğüyle oluşturuyoruz. Ancak bire bir ilişkiler de Association sözcüğünü kullanmak yerine ilişki içinde bulunan her iki sınıfta da diğer sınıf türünden bir nesne oluşturmamız yeterli oluyor.

 

Bu ilişkilerde cascading ise Association deyiminin içine yazacağımız Aggregated sözcüğü ile sağlıyoruz. Eğer Aggregated yazmassak silme ve güncelleme işlemlerini yapıyor. Yazdığımız takdirde ise diğer tablolarla ilişki içinde olduğu için bu işlemlere izin vermiyor.

[ Aggregated , Association ( “FK_Address_Person” , typeof ( Address ))]

 

Aggregated: Cascading’i sağlıyor.

FK_Address_Person: İlişkimizin ismi.

Address: Diğer sınıfın ismi. Bir nevi ilişki kurulacak tablo da denilebilir.

Bire bir ilişkiyi sınıfımızda gösterme:

İlişkideki ilk sınıfımız:

public class Ev : XPObject

{

public Ev() {

}

public Ev( Session session) :

base (session) {

}

[ Aggregated , Association ( “FK” , typeof ( Insan ))]

Insan owner = null ;

public Insan Owner

{

get { return owner; }

set

{

if (owner == value )

return ;

Insan prevOwner = owner;

owner = value ;

 

if (prevOwner != null && prevOwner.House == this )

prevOwner.House = null ;

 

if (owner != null )

owner.House = this ;

}

}

}

Diğer sınıf:

public class Insan : XPObject

{

 

public Insan() {

}

public Insan( Session session) :

base (session) {

}

 

 

[ Aggregated , Association ( “FK” , typeof ( Ev ))]

Ev house = null ;

public Ev House

{

get { return house; }

set

{

if (house == value )

return ;

 

Ev prevHouse = house;

house = value ;

 

if (prevHouse != null && prevHouse.Owner == this )

prevHouse.Owner = null ;

 

if (house != null )

house.Owner = this ;

}

}

}

1 e Çok ilişki:

public class Person : XPBaseObject

{

private int fId;

[ Key ( true )]

public int ID

{

get { return fId; }

set

{

if ( value == ID) return ;

fId = value ;

}

}

 

public Person()

{

Name = “” ;

}

public string Name;

[ Aggregated , Association ( “FK_Address_Person” , typeof ( Address ))]

public XPCollection Addresses

{

get { return GetCollection( “Addresses” ); }

}

}

Diğer Sınıf:

public class Address : XPBaseObject

{

private int fId;

[ Key ( true )]

public int AID

{

get { return fId; }

set

{

if ( value == AID) return ;

fId = value ;

}

}

 

 

public Address()

{

AddressInfo = “” ;

}

public Address( string addr)

{

AddressInfo = addr;

}

[ Association ( “FK_Address_Person” )]

public Person ID;

public string AddressInfo;

}

Bire çok ilişkinin bire bir ilişkiden farkı Association kullanmamız. Association sözcüğünün hemen altında da diğer sınıfa ait nesnemiz var. 1 çok ilişkide bir diğer ayırt edici özellikte Çok olan kısımda bir XPCollection kullanmamız böylece bir tablodaki bir veri için diğer tablodan birden fazla veri getirebiliyoruz.

Çoka Çok İlişki:

Çok çok ilişkide aynı bire çok ilişki gibidir. Tek farkı bu sefer iki sınıfta da Association’ın iki ucuda XPCollection’dır. Bireçok ve çokaçok ilişkilerdeki bu XPCollection’lar diğer sınıf türündedir.

Transaction:

XPO’da transaction’ı sessionlar aracılığıyla yapıyoruz. Bu işlemi yaparken 3 metod kullanıyoruz. Bunlardan ilki transaction’ı başlatmamızı sağlayan BeginTransaction, bundan sonra ekleme silme güncelleme işlemlerimizi yaptıktan sonra CommitTransaction metodu ile tamamlıyoruz. Eğer bir problem olursa bunu yakalayıp RollbackTransaction metodu ile yaptığımız değişiklikleri geri alıyoruz.

using (Session session = new Session()) {

session.BeginTransaction();

try {

// ekleme silme güncelleme işlemleri

session.CommitTransaction();

}

catch {

session.RollbackTransaction();

throw;

}

}

Validation:

XPO ile validation işlemlerinde öncelikle Exception sınıfından türeyen bir sınıf oluşturuyoruz. Bu sınıfımızda da constructor metodumuzda vereceğimiz uyarıyı belirtiyoruz.

Daha sonra XPO ile bize sağlanan OnDeleted, OnDeleting, OnLoaded, OnLoading, OnSaved, OnSaving metodlarından birini tekrar yazarak kontrolü ne zaman yapacağımızı, hangi kontrolü yapacağımızı ve oluşturacağımız exception’ı belirliyoruz.

public class RequiredPropertyValueMissing: Exception

{

public RequiredPropertyValueMissing(XPObject theObject, string propertyName):

base(String.Format(“The {0} property of the {1} object with id {2} must have a

value”, propertyName, theObject.GetType().Name, theObject.Oid))

{

}

}

 

public class Company : Person {

public string Name = “”;

protected override void OnSaving() {

if (Name == “”)

throw new RequiredPropertyValueMissing(this, “Name”);

}

}

 

        Bu makale serimizde O/R Mapping kavramından ve bunun XPO ile nasıl yapılabilceğinden bahsetmeye çalıştım. Konuyla ilgili veya diğer her türlü sorunuz için mail adresimden bana ulaşabilirsiniz. Bir başka makalede buluşmak üzere.

 

Her türlü sorunuzu metkor@gmail.com dan iletebilirsiniz.

Referans: www.devexpress.com/XPO

Leave a Reply

Your email address will not be published. Required fields are marked *