Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Sefer Algan
Sefer Algan
http://www.seferalgan.com
İletişme geçmek için tıklayın.
71 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: ADO EF ado.net entity framework EF EF 4 EF 4.0 Yenilikleri EF4 entity entity framework Entity Framework Yenilikleri lazy loading ADO.NET/SQL Sefer Algan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : ADO.NET/SQL
Yayınlanma Tarihi : 4.9.2009
Okunma Sayısı : 34853
Yorum Sayısı : 4     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 24.11.2024
Turhal Temizer
Mac OS/X Removing CUDA 24.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 24.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 24.11.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Entity Framework 4 ile Birlikte Gelecek İyileştirmeler
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon

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...

Makale:
Entity Framework 4 ile Birlikte Gelecek İyileştirmeler ADO.NET ve SQL Sefer Algan
  • Yazılan Yorumlar
  • Yorum Yaz
KAS
28
2012
Merhabalar,mesela "DemoEntities ctx = new DemoEntities();" şeklinde entity çağırırken kısaca veri tabanındaki tablo ve verilerin kopyasını almıyor muyuz..ve bu zamanla veriler çoğaldığında performansa etki etmez mi...teşekkürler..
ŞUB
21
2010
Entity Framework 4 çıktı ve bahsettiğiniz Dinamik Entity Yaratmak bunun içinde geldi mi? Geldiyse biraz açıklarsanız sevinirim.
EYL
10
2009
merhabalar, bildiğim kadarıyla EF'nin şu anda söylediğiniz veritabanlarına ait EF providerları mevcut. Ancak bunlardan sadece Oracle ve Sql Server için olanlarını Microsoft geliştiriyor. Sql Server için olan direkt framework içerisinde ama Oracle Provider'ını ayrıca indirmeniz gerekiyor. Piyasada Sybase, Mysql, firebird, mysql gibi veritabanlarının da destekleyen araçlar mevcut.
EYL
6
2009
Güzel makale için teşekkürler. EF hangi db lere desteği var yada olacak? Sybase, Mysql, Oracle ? Teşekkürler
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor