Bir önceki yazımda Entity Framework’ün mevcut halindeki eksikliklerden ve zayıf yönlerinden bahsetmiştim. O yazıyı okumayanların öncelikle onu okumalarını tavsiye ederim.
http://www.csharpnedir.com/articles/read/?id=959&filter=unedited&title=Entity
Not : Yazımın bundan sonraki bölümlerinde Entity Framework yerine kısaca EF yazacağım.
Açıkca söylemek gerekirse Entity Framwork’ün ilk versiyonu kurumsal uygulamalarda kullanmak için oldukça yetersiz ve alternatiflerine göre bir hayli geride duruyor. Bir çok özelliği eksik olmakla beraber bir çok konu ise bir sonraki versiyona bırakılmış. Bu durumu Microsoft’taki ADO.NET EF takımı da açıkca söylüyor zaten. Bu ilk sürümün geçiş versiyonu olması VS.NET 2008 Service Pack 1 ile sunulmasından da anllaşılabilir. EF’nin gerçekten işe yarar versiyonunu .NET 4.0 ile birlikte göreceğiz. .NET 4.0 ve Visual Studio.NET 2010 ile birlikte gelecek olan bu versiyona da kısaca EF4 diyoruz. Aslında bundan sonraki bütün .NET sürümlerinde EF direk geleceği için EF için ayrıca bir sürüm numarası tutulmayacak.
Bundan sonraki aşamada bahsedeceğim özelliklerin EF4’de yeni geleceğini düşünürsek, şu anki EF’nin neden gerçekten eksiklerle dolu olduğunu anlamış oluruz. İşte EF4 ile gelecek yenilikler. (Yenilik dediğime bakmayın, aslında olması gerekenler bunlar ama yeni geleceği için yenilik demekten başka seçenek yok)
XML Model Olmadan EF’nin Kullanımı
EF’nin vizyonu oldukça geniş olmasına rağmen bu genişlik içerisinde basit bir ORM’de bile olması gereken bazı özellikler ilk versiyona yetiştirilememiş. Bizim de firma olarak EF’yi şu anda kullanmıyor olmamızın nedenlerinden biri XML Model olmadan Entity nesnelerini yaratamıyor olmamızdır. Yani sadece kod yazarak aynen LINQ To Sql’de olduğu gibi niteliklerle(attribute) yaratılıp kullanılabilmelidir. Yoğun istek üzere bu kullanım şeklide EF’nin gelecek özellikler listesinin başında geliyor. Bu özelliğin VS 2010’a yetişmeme ihtimalini de söylüyorlar ama yetişmesi için uğraşıyorlar.
Dinamik Entity Yaratmak
Mevcut versiyonda Entity yaratmak için Xml Model şart olduğu için geliştirme zamanında, hakkında fikir sahibi olmadığımız bir veritabanına Entity’ler ile erişemiyoruz. Bunun garip bir yöntemle yöntemle çalışma zamanında CSDL ,SSDL gibi model tanımlarını oluşturarak yapabiliriz ancak, dinamik Entity kullanımı bu şekilde kabul edilemez bir durumdur. Neyseki, yeni versiyonda XML Model olmadan dinamik olarak Entity nesnelerini yaratabileceğiz. Sadece bu imkanın eksikliği bile EF’nin tercih edilebilirliğini büyük ölçüde düşürmekteydi, özellikle de büyük çaplı projeler içinde.
Model’den Üretilen Kodların Çeşitliliği
Bilindiği üzere EF Designer’da düzenlenen model XML formatında tutuluyor. Aynı şekilde bu model kullanılarak şablonu önceden belirlenmiş bir kod üretiliyor. Bu kod içerisinde Entity sınıfları ve ObjectContext nesneleri bulunuyor. Bu kod içerisinde belkide istemediğimiz EF özellikleri veya gereksiz bir takım elemanlar olabiliyor. Model’den üretilen kodları farklılaştırmak için Visual Studio için Add-In yazılabilir ancak bu çok zahmetli bir iş ve kimse buna yanaşmaz. Bunun yerine zaten VS içerisinde bulunan kod üretim aracı olan T4 şablonları kullanılabilirdi. EF’nin bir sonraki versiyonunda işte tamda bu özellik geliyor. Yani isteyen kendi kod şablonunu oluşturabilecek. Mevcut durumda bütün üretilen kod tek bir dosyada toplanıyor, istersek her bir Entity’yi farklı dosyalara bölebiliriz. Kullanmadığımız özellikleri üretmeyebiliriz. Bundan sonrası hayal gücümüzle sınırlı.
T4 şablonları ile ilgili detaylı bilgi almak isterseniz bu konu ile ilgili hazırlamış olduğum görsel dersi aşağıdaki bağlantıdan izleyebilirsiniz.
http://www.csharpnedir.com/dotnettv/watch/?id=164&title=T4
Visual Studio.NET 2010 içerisinde EF modelinden kod üretmek için bir kaç alternatif kod üretim şablonunun da sunulacağını söyleyebiliriz. (Şablon dosyaları .tt uzantılıdır.)
Lazy Loading Geliyor
Lazy Loading özelliği olmayan bir ORM (gerçi Microsoft EF için ORM demiyor. EF, ORM özelliklerinide kapsar diyor) düşünemiyorum. Aslında EF1 içerisinde kısmen de olsa buna yaklaşıldı ancak bu özelliğe daha çok “deferred loading” yada “explicit lazy loading” deniliyor. Bu arada bu özelliğin LINQ To Sql ‘de bile olduğunu söylersem sanırım EF1 hakkındaki görüşlerimi tam olarak ortaya çıkarmış olurum.
Peki nedir Lazy Loading? İlişkili entity’ler üzerinden otomatik olarak ilişkili diğer entity özelliklerine transparan bir şekilde erişmeyi sağlayan bir yöntemdir. EF1’de bu şu anda olabilmekte ancak açıkca belirtmek gerekiyor. Örneğin , bir Musteri entity’sine bağlı olarak Siparis entity’si olduğunu varsayarsak mevcut EF1’de Musteri üzerinden Siparişe iki şekilde erişilebilir; Bu yöntemler aşağıdaki gibidir;
Birinci Yöntem;
var sonuc = (from m in ctx.Musteriler.Include(“Siparisler“)
select m).FirstOrDefault();
string siparisTarihi = sonuc.SparisTarihi;
İkinci Yöntem;
var sonuc = (from m in ctx.Musteriler select m).FirstOrDefault();
sonuc.Siparisler.Load(); //explicit loading
string siparisTarihi = sonuc.SparisTarihi;
EF4 içerisinde ise LazyLoading desteği ObjectContext üzerindeki EnableDeferredLoading özelliği ile ayarlanabilecek. Ancak bu özellik set edildiğinde ilgili ObjectContext üzerinden çağrılan bütün sorgular lazy loading özelliği kapalı yada açık olacak. Dolayısıyla bu özellik True olarak verildiğinde sonraki aşamalarda ilişkili Entity’ler üzerinden ayrıca yukarıdaki gibi Load metodu çağırmaya gerek olmayacaktır. Yani aynen LINQ To Sql gibi olacak.
ObjectSet ile daha tip güvenli Koleksiyonlar
EF’nin mevcut halinde herhangi bir Entity üzerinde sorgulama yapmak, entity kümesine erişmek gibi işlemler için ObjectQuery<T> isimli sınıf kullanılmaktadır. Örneğin Personel tablosu için ObjectContext’in aşağıdaki gibi bir özelliği oluyor şu anda.
public class Personel : EntityObject {}
public ObjectQuery<Personel> Personeller
{
...
}
EF4 ile birlikte ObjectQuery yerine yine ObjectQuery’den türemiş ObjectSet<T> isimli bir nesne kullanılacak. Bu da dönen sonuçlar üzerinde direk işlem yapma imkanı sağlayabileceği gibi ObjectContext üzerinden normalde aşağıdaki gibi yapılan Entity ekleme işlemi daha güvenli hale gelecektir.
Eski Kullanım;
contex.AddObject(“BTAEntities.Personel”, yeniPersonel);
Yeni Kullanım;
context.Personelller.AddObject(yeniPersonel)
Gerçi mevcut EF’de kod üretim aracı context içerisine AddPersonel, AddMusteri gibi metotlar ekleyerek bir sarmalama yapsa da üretilen kodun uzamaması açısından yukarıdaki yöntem daha şık duruyor.
POCO(Plain Old CLR Objects) Sınıfları Desteği
POCO ismi sanıyorum ki POJO (plain old java object)’dan türetilmiş. POJO yada POCO sınıfları genellikle hiç bir türeme ilişkisinin olmadığı sadece veri tutma amaçlı olarak kullanılan en basit sınıflara takılan isimlerdir. Örneğin aşağıdaki Musteri ve Siparis sınıfı POCO’dur.
public class Siparis
{
public int SiparisNo{get;set;}
}
public class Personel
{
public int No {get;set;}
public string Ad {get;set;}
public string Soyad {get;set;}
public List<Siparis> Siparisler {get;set}
}
EF4’ün bana göre en önemli özelliklerinden birisi budur. Yani artık Entity Framework POCO nesneleri ile çalışabilecek. Veritabanı entity’lerinizi illa EntityObject’den türetmeniz gerekmeyecek. Eskisi gibi karmaşık nitelik tanımı, property tanımları vs gerekmeyecek. Tabi her şeyin bir şeyi vardır(bu deyimi genellikle derslerimde kullanırım, bunu kullandığımda herkes anlar ki her kolaylığın bir dezavantajı vardır ) ilkesinden yola çıkarak bu kullanımın bir takım dezavantajları olacak. Örneğin;
- Detaylı mapping işlemi yapılamaz. (property isimleri ile sütun isminin aynı olduğu varsayılır)
- Object Tracking işlemi detaylı değildir.
- EntityObject içerisindeki elemanlar kullanılamaz.
Bir önceki bölümlerde bahsetmiş olduğum T4 şablonlarından birisi de sanırım POCO nesneleri üreten şablon olacaktır.
Önce Modelle Sonra DB Oluştur (DB Olmadan Model Oluşturma)
EF1’de Entity Model oluşturmak için Visual Studio içerisinden herhangi bir veritabanına bağlanmak gerekiyordu. (tabi model xml dosyalarını elle yazmak istemiyorsak). Yani her ne kadar Microsoft EF’nin sadece veritabanı değil bir çok veri kaynağı ile çalışabilecek vizyonu ile ön plana çıkarsa da mevcut versiyonda Entity Model veritabanı ile sıkı sıkıya bağlı kalmıştı. EF4 ile birlikte ortada hiç bir veritabanı olmasa dahi sıfırdan Entity Model yaratılabilecek. Üstelik oluşturulan bu model’den veritabanı oluşturma seçeneğide olacak. Yani önce modelle sonra veritabanı oluştur yaklaşımını benimseyenlerin oldukça işine gelecek. Yalnız bu özelliği, içerisinde veri olan veritabanında test ederseniz verileriniz uçabilir. Verileri uçmayan versiyon da sanırım VS 2012 yada VS 2013 ile birlikte gelir!.
WCF Servisleri ile Çalışırken State Management Yapma
Entity nesnelerinin en çok kullanılacağı yerlerden birisi ise tahmin edeceğiniz üzere Web servisleri olacaktır. Servisler arasında Entity taşınması mümkündür ancak Client’a gelen Entity ile sunucudaki Entity birebir aynı özelliğe sahip olmayacaktır. Çünkü bir entity ile ilgili bazı bilgiler (state bilgisi, değişim bilgileri-entity state entry-) entity üzerinde değil o entity’nin Attach edildiği ObjectContext üzerinde tutuluyor. Örneğin Server tarafında State’i Added olan bir entity servisden geçtikten sonra State bilgisi Unchanged olabiliyor. Bu senaryolar için manuel işlemler yapmak gerekiyor. EF4 ile birlikte bir Entity’nin State bilgisini manuel olarak değiştirmek için hazır metotlar sunulmuş durumda.
Designer Uyumsuzlukları
Mevcut EF 1’de model XML dosyalarından manuel olarak yaptığımız bir çok güzel özellik designer tarafından desteklenmediği için kullanamıyorduk. Bunlardan en önemlisi Entity’ler içerisinde Complex tip tanımı idi. Yeni designer ile birlikte bu uyumsuzlukların önemli çoğunluğu giderilmiş durumda.
Son Söz
Entity Framework, Microsoft’un Data erişim teknolojilerinde çok önemli bir vizyona sahip. Her ne kadar ilk versiyon ile tatmin olmasakta Microsoft’un EF üzerindeki yatırımları oldukça ses getiriyor. Bu geçiş dönemi bittiğinde EF’nin bütün Microsoft geliştirme araçlarının temel veri erişim altyapısı olacağını söyleyebiliriz. Bu yüzden şimdiden EF ile tanışmanızın oldukça iyi bir karar olacağını düşünüyorum. Her ne kadar kurumsal uygulamalarda ilk versiyonu kullanmayacak olsanızda...