Monday, February 1, 2016

Entity Framework CRUD İşlemleri - CRUD with Entity Framework

Bir yazılımın en önemli kısımlarından biri CRUD (Create, Read, Update, Delete) işlemleridir. CRUD işlemlerinin kalitesi veri kalitesine doğrudan etki eder. Bu yüzden CRUD uygulamaları özentili ve sert protokolle oluşturulmalıdır. Bu yazıda EF ile ilgili fonksiyonların nasıl olması gerektiği anlatılmıştır. Bu fonksiyonlar şunlardır:

public MyObject SelectObj(Decimal? ID)
     {
         if (ID != null)
         {
             DataBaseContext con = new DataBaseContext();
             return con.MyObjects.Include(r => r.MyObjectRelation).Single(r => r.ID == ID);
         }
         else
             return new MyObject();
     }

     public void InsertObj(MyObject Obj)
     {
         DataBaseContext con = new DataBaseContext();
         var a = con.MyObjects.Attach(Obj);
         con.Entry(a).State = EntityState.Added;
         con.SaveChanges();

     }

     public void UpdateObj(MyObject Obj)
     {
         DataBaseContext con = new DataBaseContext();
         var a = con.MyObjects.Attach(Obj);
         con.Entry(a).State = EntityState.Modified;
         con.SaveChanges();

     }

     public void DeleteObj(MyObject Obj)
     {
         DataBaseContext con = new DataBaseContext();
         var a = con.MyObjects.Attach(Obj);
         con.Entry(a).State = EntityState.Deleted;
         con.SaveChanges();
     }

Burada dikkat edilmesi gereken bir unsur ilişkili tablonun verilerinin "eargerly loading" yaklaşımıyla yapılmasıdır. Bunun direk olarak CRUD kalitesine etkisi olmamakta birlikte tarafımca performans kaygısı sebebiyle bu yöntem kullanılmaktadır.

Aşağıdaki kod satırları nesne durumunu EF'ye tanıtmaktadır.

con.Entry(a).State = EntityState.Added;
con.Entry(a).State = EntityState.Modified;
con.Entry(a).State = EntityState.Deleted;

Bu satırlardan Added nesnenin yeni eklendiğini belirtmekte ve INSERT DML (Data Manipulation Language) komutunu ima etmekte, Modified nesnenin güncellendiğini ve UPDATE DML komutunu ima etmekte, Deleted ise nesnenin silindiğini ve DELETE DML komutunu ima etmektedir.

Direk nesne üzerinden yapılan durum belirtimleri nesnenin tüm propertyleri için geçerlidir. Örneğin Modified durumu sonucu oluşan SQL (Structured Query Language) tüm property'leri içerecektir. Eğer ilgili nesnenin belirli property'leri güncellenmek isteniyorsa aşağıdaki kod satırı kullanılmalıdır:

con.Entry(a).Property(r => r.MyProperty).EntityEntry.State = EntityState.Modified;

veya

con.Entry(a).Property(r => r.MyProperty).IsModified = true;

Burada MyProperty güncellenmiş olarak işaretlenmiş ve güncellemede sadece gösterilen property dikkate alınacaktır. 

Bir diğer husus ise "using" kullanımıdır. "Context" nesneleri yüksek maliyetli nesneler oldukları için kaynakların çabuk bırakılması yararlı olacaktır. Bu yüzden "Context" nesnelerinin "using" bloğu kullanılarak kullanılması yararlı olacaktır.

Son olarak yukarıdaki işlemlerde nesne tanımlayıcısının yani "primary key" alanlarının kesinlikle tam olması şarttır.



1 comment: