25 Mayıs 2014 Pazar

POCO (Plain Old CLR Objects)


   Merhaba arkadaşlar,

   Bu hafta birlikte POCO objeleri hakkında çalışma yapacağız. POCO objeleri üzerindeki çalışmalarımızı gerçekleştirirken izleyeceğimiz yol şu şekilde olacak;
  • POCO objelerini açıklama
  • POCO objelerini oluşturma
  • POCO objeleri ile CRUD işlemleri
   *POCO Objelerini Açıklama

   Entity Framework, ADO.NET Data Model'da yer alan varlıklarımız(entity) için kendi sınıflarımızı yazabilmemize destek verir. Bu yapıda, varlıklar herhangi bir sınıftan türetilmez, herhangi bir interface'i implemente etmez, veri en sade şekilde tutulur. Böylece projemizi otomatik olarak oluşturulan modelle birlikte gelen birçok koddan kurtarıp, daha basit bir model oluşmasını sağlayabiliriz.

   *POCO Objesi Oluşturma

   Her zaman yaptığımız gibi oluşturduğumuz projeye Entity Framework Data Model oluşturma işlemlerini gerçekleştiriyoruz. Bu haftaki yazımda Microsoft'un hazır veritabanlarından biri olan AdventureWork veritabanını kullanacağım. İlgili veritabanına uygun olarak modelimizi oluştururken table bölümünden sadece ProductCategory tablosunu seçelim ve model oluşturmayı bitirelim. daha sonra .edmx uzantılı pencereye sağ tıklayıp Property penceresinden Code Generation Strategy kısmını None yapalım. Bu işlemi POCO objesi oluşturmak için yapmamız şart. 

Figür 1- Code Generation Strategy

   Code Generation Strategy kısmını None yaptıktan sonra Designer.cs sınıfımızın görüntüsü aşağıdaki gibi olacaktır.

Figür 2-Designer.cs

   Veritabanımız üzerinde yapacağımızı işlemleri gerçekleştirmek için tabloyla aynı isimde olan bir sınıf oluşturmamız gerekiyor. ProductCategory tablosu üzerinde çalışacağımız için ProductCategory isminde bir sınıf oluşturuyoruz ve bu sınıfımıza tablonun attributeleriyle aynı isimde olan propertyleri tanımlıyoruz.

Figür 3-ProductCategory Sınıfı

   Bu işlemi de tamamladıktan sonra Context tanımlaması yapabiliriz. Entity Framework ile otomatik oluşturulan Context, ObjectContext sınıfından kalıtılır. Bunu, bir EF oluşturduğunuzda Designer.cs'ine bakarak da görebilirsiniz.



   İlk önce yukarıdaki using kısmını projemize ekledikten sonra Program:objectContext kısmını kullanabiliriz. Program sınıfımızda, ProductCategory sınıfımızı barındıran ObjectSet tipinden bir özelliğimizin olması gerekiyor. Bunu sağlamak için de, aşağıdaki tanımlamaları  yapıyoruz.

Figür 4-Object Set

   CreateObjectSet() metodu ile yaptığımız örnekleme işlemini Context'imizin Constructor'ında da yapabiliriz. Şu an, sadece tek bir tablo üzerinde çalışıyoruz. O yüzden, bu işlemi Constructor'da yapmak performans ve bellek kullanımı konusunda sorun olmaz ama gerçek hayatta modellerimiz birçok tablodan oluşacak ve bu durumda Constructor'da gereksiz yere yaptığımız örnekleme, çok da optimum bir işlem olmayacaktır. Bu nedenle, en makul yöntem ObjectSet'imizi ihtiyaç duyduğumuzda oluşturmak.

   Bu aşamada, Context'imiz hala hangi bağlantı cümleciğini kullandığını bilmiyor. O nedenle Constructor'da bunu bildirmemiz gerekiyor.

Figür 5- Constructor

   Buradaki ilk parametre entity data modelimizi oluştururken App.Config dosyasına kaydettiğimiz bağlantı cümlesi(ConnectionString)nin adı, ikinci parametre ise Entity Container'ın adı(). Bu adı, Model'e sağ tıklayıp Model Browser dediğimizde açılan pencereden, AdventureWorksModel'ın altındaki EntityContainer'dan öğrenebilirsiniz.

   *POCO CRUD İşlemleri

   POCO objeleri kullanarak CRUD işlemleri yapmak çok basit. İsterseniz Create işleminden başlayabiliriz.

   Kayıt Ekleme

Figür 6-Ekleme

   Dikkat edecek olursak ctx.ProductCategory aslında bizim ObjectSet özelliğimiz. Burada SaveChanges() metodunu çağırmadığımız sürece veritabanı yapılan değişiklikden haberdar olmaz.

   Kayıt Güncelleme

Figür 7-Kayıt Güncelleme

   Context'teki ProductCategory sınıfımızın Model'deki hangi tabloya karşılık geldiğini bulmak için Context sınıfına bir metot yazılabilir ve ya ProductCategory sınıfımızda public const string EntitySetName="ProductCategory" şeklinde tanımlamada yapılabilir. Eğer bir metot yazmak istersek aşağıdaki gibi olmalıdır.
.

   public EntitySetBase GetEntitySet(Object entityType)
{
EntityContainer container = this.MetadataWorkspace.GetEntityContainer(this.DefaultContainerName,DataSpace.CSpace);
EntitySetBase entitySet = container.BaseEntitySets.SingleOrDefault(es => es.ElementType.Name == entityType.GetType().Name);           
return entitySet;
}

   Kayıt Silme

Figür 8-Kayıt Silme

   Öncelikle, sileceğimiz category nesnesini Context'imize ekliyoruz. DeleteObject() metodunu çağırdığımızda aslında silme işlemi gerçekleşmiyor; sadece nesnemiz silinecek olarak işaretleniyor, SaveChanges() dediğimizde siliniyor.

   Kayıt Getirme

Figür 9-Kayıt Listeleme

   Listeleme işlemide yukarıdaki kod blogu gibi yapılabilir. ProductCategory tipinde bir liste oluşturuyoruz. Daha sonra bu listeye bütün ProductCategory değerlerini yazıp listemizi döndürüyoruz. 

   POCO objelerini kullanarak CRUD işlemlerini açıkladıktan sonra bu haftaki yazımın sonuna geliyorum. Faydalı bir yazı olmuştur umarım. Bir sonraki hafta bu zamana kadar yapılan işlemlerin değerlendirmesini yapmak için tekrar burda olacağım. Görüşmek üzere...

Hiç yorum yok:

Yorum Gönder