ADO.NET Entity Framework bildiğiniz gibi Visual Studio .NET 2008 SP 1 ile kullanıma girmişti. .NET 4.0 ile de EF içerisinde bir çok yenilik bekliyoruz, ancak mevcut haliyle EF içerisinde bir çok eksiğin olduğunu söyleyebilirim. Uzun süredir EF'nin hangi tip projelerde kullanılabileceği üzerine araştırma yapıyorum. Bu yazıda EF'nin eksiklikleri ve yapamadıklarından en temel olanlarını paylaşmak istiyorum;
Dinamik Entity Yaratılamaması
EF'nin çalışması için statik olarak bir metadata (csdl,ssdl vs bilgilerini içeren dosya) dosyasına ihtiyaç duyması bazı projeler için büyük dezavantaj. Örneğin bir Framework geliştiren firma iseniz ve uygulamalarınızın çok farklı veri senaryolarında çalışmasını garanti etmek istiyorsanız statik bir metadata dosyası yaratamazsınız. Bu işlemin dinamik olması ve Entity'lerinde hard-coded bir şekilde yaratılmaması gerekir. Söz gelimi, otomatik olarak ekranların üretildiği bir UI Frameowrk'u geliştirmek istediğinizda veri erişim altyapısında EF kullanamazsınız, çünkü dinamik olarak Entity nesneleri oluşturulamıyor. Bu da EF'nin daha çok "data store'u" belli olan ve şemasıda açıkca belirlenmiş projelerde kullanımını ön plana çıkarıyor. Aslında metada xml'lerinin dinamik olarak oluşturulması bir seçenek olarak önümüzde durmasına rağmen bu yöntem kulağı tersten tutmakla eş değer olacağı için bu yöntemi benimseyemiyorum.
Metadata Designer ile EF Özelliklerinin Uyumsuzluğu
EF'nin bir çok güzel ve ileri diyebileceğimiz özellikleri direkt olarak MetadaData designer aracı üzerinden belirtilememektedir. Örneğin bir Sütun'un özelliklerini belirleme gibi. Bu durumlarda metada'nın SSDL kısmı manuel olarak elle değiştirilmektedir. Bunun gibi bir çok özelliği aktive etmek için manuel değişiklik yapma olanağı güzel ancak bu durumda "Update Model Wizard" kullanıp SSDL'i güncellemek isterseniz yaptığınız manuel değişikliklerin tamamı silinecektir. EF geliştiricilerinin bu problemi aşması için XML Inheritance gibi bir kavramı ortaya atıp "auto generated xml" ile programcının değiştirdiği kısımların soyutlanması gerekiyor. Aynen C# class'larında oluğu gibi Partial XML gibi bir yapıya ihtiyaç var. İleriki versiyonlarda bunun düzeleceğine eminim.
LINQ To Entitis Sorgularının Çalışıp Çalışmayacağını bilememe
Bazı LINQ To Entity sorgularında ister istemez .NET'in sunduğu kütüphaneleri kullanmak istiyoruz. En basitinden String sınıfının veya Datetime sınıfının üye elemanlarını kullanıyoruz. Örneğin;
from c in ctx.Siparisler
where c.SiparisNo ==3
select c.SiparisTarihi.ToShortDateString();
İç güdüsel olarak ToShortDateString metodunun çalışmasını bekliyoruz ama bunun çalışma zamanında desteklenmeyen bir özellik olduğunu anlıyoruz. Derleme aşamasında bunun belirli olması geliştirme eforu ve zaman kaybı açısından önemli olduğunu düşünüyorum. Daha güzel Expression Tree yapısı bekliyoruz EF takımından.
DataContext.Refresh metodu beklenen şekilde çalışmıyor..
Özellikle eş zamanlılık(concurrency) kontrolü gerektiren noktalarda Entity değişimlerini db'ye göndermeden önce Refresh metodu ile DataContext üzerinde yüklü Entity'lerin yeniden yüklenmesini sağlıyoruz. Bu işlem Refresh metodu ile yapılabiliyor. Diyelimli DataContext üzerinde Müşteri listesi ve ona bağlı Müşteri Sipariş entity listesi var. Eğer Sipariş listesi müşteri ye bağlı olarak DataContext'e yüklenmiş ise Refresh metodunu çağırdığınızda sadece Müşteri bilgilerini yüklüyor, diğer bağlı Entity'lerin yüklenmesi için bir mekanizmas sunulmamış. Aslında olması gereken bütün Entity'lerin yüklenmesidir. Yada bu opsiyonun başka bir şekilde olabilmesidir.
Gerçek Manada Lazy Loading Yok..
EF içerisinde Lazy Load denilen bağlantılı tablolardaki Entity değerlerine erişirken bu verilerin arkada otomatik olarak yüklenmesi yoktur. Bunun yerine manuel olarak Load isimli metotlar çağrılır. Bunada genel olarak deferred loading (ertlelenmiş yükleme) yada "explicit lazy loading" denilmekte. EF 4.0 ile birlikte gerçek Lazy Loading geleceği söyleniyor.
Diğer Notlar :
Her ne kadar EF'de yukarıda saydığım eksiklikler olsada temel manada bir çok özelliği ile birlikte oldukça kullanışlı bir altyapı olduğunu söyleyebilirim. Yakın bir zaman içerisinde .NET 4.0'ında çıkacağını varsayarsak (bu eksiklerin bir kısmının giderileceğini düşünüyorum) şimiden EF'ye adapte olmak ve projelerde kullanmaya başlamak yararlı olacaktır.