"http://www.w3.org/TR/html4/loose.dtd">XPO ile O\R MAPPING -3Merhabalar, 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
|
"http://www.w3.org/TR/html4/loose.dtd">XPO ile O\R MAPPING -2Merhabalar, 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. Bu makalemizde temel ekleme, çıkarma, güncelleme, veri getirme ve kümeleme işlemlerinden bahsedeceğiz.
Ekleme Çıkarma Güncelleme Getirme: Bu işlemleri yapmadan önce elimizde bulunan veritabanına göre sınıfımız oluşturalım. class proje : XPBaseObject { public proje () {} public proje ( Session session) : base (session) {} public proje ( Session session, string projectName, string owner): base (session) { this .projeAdi = padi; this .projeSahibi = psahibi; } private int pId; private string projeAdi; private string projeSahibi;
[ Key ( true )] public int ID { get { return pId; } set { if ( value == ID) return ; pId = value ; } } public string ProjectName { get { return projeAdi; } set { string oldValue = padi; if (oldValue == value ) return ; projeAdi = value ; OnChanged( "ProjectName" , oldValue, value ); } } public string Owner { get { return projeSahibi; } set { string oldValue = psahibi; if (oldValue == value ) return ; projeSahibi = value ; OnChanged( "Owner" , oldValue, value ); } } } Sınıfımızda gördüğümüz [Key(true)] sözcüğüyle OID kullanmayacağımızı söylüyoruz ve veritabanındaki PK yı belirlemek için bu alanın tanımladığımız yerin hemen üstüne yazıyoruz. Key gibi kullanılan bir diğer yapımız ise [Indexed] bu söcükle veritabanımızda index olarak kullanılan alanları belirtiyoruz. [ Indexed ( "Ad;Dtarih" , Unique = true )] public string Soyad = string .Empty; public string Ad = string .Empty; public DateTime Dtarih; Bu kullanımda Indexed sözcüğü hemen Soyad ın üstünde belirtildiği ve Ad-Dtarih ‘te Indexed sözcüğü içnde belirtildiği için bu üç alanın index olarak kullanıldığını anlayabiliriz. Sadece Soyad ın index olmasını isteseydik Ad ve Dtarih alanlarını Indexed sözcüğü içine yazmayacaktık. Ekleme: XpoDefault .ConnectionString = "Data Source=******;Initial Catalog=******;UID=mehmet;password=12345" ; using ( UnitOfWork uow = new UnitOfWork ()) { insan p = new insan (uow); p.ProjectName = “Deneme”; p.Owner = “Metko”; uow.CommitChanges();
} Silme: XpoDefault .ConnectionString = "Data Source=******;Initial Catalog=******;UID=mehmet;password=12345" ; XPCollection kaynak = new XPCollection ( typeof ( insan )); using ( UnitOfWork uow = new UnitOfWork ()) { insan p = kaynak[2] as insan ; p.Delete(); uow.CommitChanges(); } Burada gördüğümüz XpCollection yapısı verdiğimiz sınıf isminde yani tablodaki verileri getirip tutuyor. Daha sonra verdimiz index numarasıyla istediğimiz veriyi alabiliyoruz. Burada çektiğimiz verilerdeki 2 index nolu nesne siliniyor. Güncelleme: XpoDefault .ConnectionString = "Data Source=******;Initial Catalog=******;UID=mehmet;password=12345" ; XPCollection kaynak = new XPCollection ( typeof ( insan )); using ( UnitOfWork uow = new UnitOfWork ()) { insan p = kaynak[2] as insan ; p.ProjectName = “Deneme2”; p.Owner = “ABH”; uow.CommitChanges(); }
Burada da çektiğimiz verinin alanlarına direk istediğimiz verileri girip CommitChanges metodunu çağırdığımızda verileri güncellemiş oluyoruz. Verileri getirme: Verileri XPCollection nesnesinde tuttuğumuz belirtmiştik. XPCollection nesnesinin bir diğer özelliği ise DataSource olarak gösterilebilmesidir. Bu özelliği sayesinde verileri kolayca çekebiliriz. XpoDefault .ConnectionString = "Data Source=******;Initial Catalog=******;UID=mehmet;password=12345" ; XPCollection kaynak = new XPCollection ( typeof ( insan )); gridControl1.DataSource = kaynak;
Arama ve Kümeleme İşlemleri: XPO ile arama ve kümeleme işlemlerini CriteriaOperator nesnesiyle yapabiliriz. Bu işlemi ya verileri çekerken XPCollection nesnesiyle yada daha sonradan Filter metoduyla yapabiliriz. Birkaç örnek vermek gerekirse: CriteriaOperatorun özelliği değiştirilerek max,min,sum,avg,count vs işlemleri de yapılbiliyor. ——XPCollection kaynak = new XPCollection(typeof(muhasebe), ——CriteriaOperator.Parse("HesaplarSınıfı.Sum(HesapAlanı) < 100")); —- XPCollection kaynak1 = new XPCollection ( typeof ( muhasebe ), CriteriaOperator .Parse( "ID==’" + int .Parse(textBox1.Text)+ "’" )); —– XPCollection kaynak = new XPCollection ( typeof ( insan )); ——CriteriaOperator filter = new BinaryOperator ( "Owner" , textBox1.Text, BinaryOperatorType .Equal);
Son makalemizde XPO’da ilişkilerden , transaction ve validation kavramlarından bahsedeceğiz. Her türlü sorunuzu metkor@gmail.com dan iletebilirsiniz. Referans: www.devexpress.com/XPO
|
"http://www.w3.org/TR/html4/loose.dtd">XPO ile O\R MAPPING -1Merhabalar, 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 Object Relational Mapping : O\R Mapping kısaca nesne tabanlı programlama dilleri ile ilişkisel veritabanları arasında ilişkilendirme yapmamızı sağlayan bir programlama tekniğidir. Yani veritabanı üzerinde yapacağımız işlemler için hiçbir Sql kodu yazmamız gerekmez. Veritabanı üzerindeki alanlara programımızda oluşturduğumuz sınıflar aracılığıyla ulaşıyoruz ve ekleme silme vb işlemleri sınıflar üzerinden yapıyoruz. Böylece veritabanı bağımsız uygulamalar yapabiliyoruz. Bu işlemi yapmamamız sağlayan çeşitli çözümler var açık kaynak kodlu Nhibernate, .Net 3.0 ile gelen LINQ, DevExpress Xpo bunlardan bir kaçı.
XPO: Açılımı eXpress Persistent Objects olan XPO Developer Express’e ait O\R Mapping çözümüdür. XPO veritabanı katmanını uygulama geliştiriciden soyutlar ve onun sadece nesne tabanlı olarak çalışmasını sağlar. Uygulamamızı geliştirirken DevExpress.XPO namespace’imizi uygulamamızda belirtmemiz gerekiyor. Sınıf oluşturma: Sınıfımızı normal bir sınıf oluşturur gibi oluşturuyoruz. Tek farkı oluşturduğumuz sınıfın XPObject’den türetilmiş olması. Örneğin class insan : XPObject { public string adi; public string soyadi; public int yasi; public string cinsiyet; }
Veritabanımızda olsa bile XPO not null alan tanımlamaya izin vermez. Bunları programatik olarak yakalamamız gerekir. Temel Veritabanı işlemleri: Temel veritabanı işlemlerine geçmeden önce veritabanı bağlantısı hakkında belirtmemiz gereken bir şey var. XPO eğer veritabanı yönetim sistemi hakkında birşey belirtmezsek varsayılan olarak Access’i kabul ediyor ve Access veritabanı oluşturuyor. Eğer farklı bir veritabanı yönetim sistemi belirtmek istiyorsak XpoDefault.ConnectionString deyimiyle veritabanı bilgilerimiz belirtmemiz gerekiyor. Örneğin XpoDefault .ConnectionString = "Data Source=******;Initial Catalog=******;UID=mehmet;password=12345" ; Veritabanı üzerinde işlemler yapabilmemiz için Session veya Unit of Work oluşturmamız gerekiyor. Ancak session oluşturmazsak uygulama tarafından DefaultSession kullanılıyor. En basit şekliyle bir ekleme işlemini şu şekilde gerçekleştiririz. XpoDefault .ConnectionString = "Data Source=******;Initial Catalog=******;UID=mehmet;password=12345" ; insan contact = new insan (); contact.adi = “Ali”; contact.soyadi = “Veli”; contact.yasi = 23; contact.cinsiyet = “Erkek”; contact.Save(); Session: Session’ları veritabanı işlemleri sırasında verileri tutan bir yapı olarak düşünebiliriz. Session’lar veritabanı işlemleri sırasında veritabanı bağlantı bilgilerinin bulunduğu Data Access Layer’ları kullanır. Sessionlar varsayılan olarak kullanılabileceği gibi kendi sessionlarımızı da oluşturabiliriz. Session mySession = new Session(); Şeklinde session’ımızı oluşturabiliriz. Kendi oluşturduğumuz session’ı kullanabilmek için Constructor metodumuza session’ımızı iletmeliyiz. Daha sonra veritabanına bağlanabilmek için bu sessiona ait ConnectionString yada Connection özellikleri belirmemiz gerekiyor. Session’a bağlanmak için Connect, bağlantıyı kesmek için Disconnect metodlarını kullanıyoruz. Ama Connect metodunu kullanmaz isek XPO otomatik olarak bağlanır. Bu durumda Connect metodu hiçbir şey yapmaz. class insan : XPObject { public string adi; public string soyadi; public int yasi; public string cinsiyet; public Customer(Session session) : base(session) {} }
Unit Of Work : Unit of work’ler de session’larla aynı işi yaparlar. Aralarındaki tek fark Session’larda her değişiklik için Save metodu çağrılırken Unit of work lerde yapılan değişiklerin tutularak tek bir CommitChanges metoduyla tüm değişiklerin kaydedilebilmesidir. Ancak bunun için sınıfımız içinde OnChanged metodu kullanılmalıdır. class insan : XPObject { public insan(Session session) : base(session) { } public insan(Session session, string name) : base(session) { this.name = name; } private string ad; public string Ad { get { return ad; } set { string eski = Ad; if(eski == value) return; ad = value; OnChanged("Ad", eski, value); } }
Veritabanında yapacağımız işlemlerde eğer tablomuz yok ise XPO verdiğimiz bilgilere ve sınıfımıza göre bir tane oluşturuyor ve tek olan bir primary key OID atıyor. Eğer var olan bir tablo üzerinde işlemler yapmak istiyorsak sınıfımız veritabanımıza göre yazmamız yeterli. Eğer var olan bir Key kullanacaksak ve OID yi kullanmak istemiyorsak sınıfımızı XPObject’ten değil XPBaseObject’ten türetmelisiniz. İlk makalemizde O/R Mapping’den, XPO’dan ve temel sınıf işlemlerinden bahsettik. Diğer makalemizde biraz daha veritabanı işlemlerine girmeye başlayacağız. Her türlü sorunuzu metkor@gmail.com dan iletebilirsiniz.
|
|
Ekrem AKSOY
|
Ekrem AKSOY
|
Ekrem AKSOY
|
Ekrem AKSOY


.gif)
.gif)

.gif)
.gif)
Son Yorumlar