Visual Studio 2012 için Entity Framework Yenilikleri

Delphi5_RTMMerhaba Arkadaşlar,

Çok eskiden kullanılan programlama dilleri ve platformları düşünüldüğünde çok ilkel IDE’ ler ile çalışmış olduğumuzu görmekteyiz. Hatta bazı programlama dilleri ile yapılan geliştirmelerde değil IDE, komut satırına mahkum olmuşuzdur(Gerçi komut satırında script yazarak geliştirme yapmak özellikle fonksiyonel programlama dilleri göz önüne alınırsa oldukça popüler ve isabetlidir)

Gelişen sistemler, kullanıcı deneyimleri ve görselliklerin artması ile de yazılımcıların daha profesyonel olan IDE’ ler üzerinde çalışması şart olmuştur.

Bu anlamda tarihin belki en başarılı geliştirme arayüzlerinden birisi, herkesin bildiği üzere Delphi ortamıdır. Ne varki o zaman ki Borland firmasının sahip olduğu bu özellik, Anders Heijslberg’ in Microsoft takımına geçmesi ile birlikte yerini Visual Studio ailesine bırakmıştır. Anders sadece .Net Framework plaformu ve C# diline babalık etmemiş önemli bir User Experience tecrübesini de Microsoft şirketine taşımıştır. Visual Studio özellikle 2008 sürümünden itibaren inanılmaz derecede gelişti ve gelişmeye de devam ediyor.

Bu IDE ile çalışmak hem çok keyifli, hem de tek bir ortam üzerinden çok geniş bir yelpazeye ulaşılabilmekte. Açıkçası IDE dışına çıkmadan herşeyin elinizin altında olduğu bir geliştirme ortamında çalışmanın değeri paha biçilemez…Gerisi için Master Card Smile with tongue out

Entity Framework bilindiği üzere son sürümlerinden itibaren çok daha fazla etkili olmaya başladı. Bu noktada Ado.Net geliştirici takımının müşteri ihtiyaçlarını da çeşitli anketler yardımıyla dinliyor olmasının önemi büyüktür. Örneğin uzun bir zaman anketin en üst sıralarında yer alan Enum desteğinin getirilmesi gibi. (Bu amaçla açılan Entity Framework Feature Suggestions forumunu takip etmenizi öneririm)

Biz bu yazımızda Entity Framework’ ün Visual Studio 2012 tarafındaki bazı yeniliklerine değinmeye çalışıyor olacağız(Bazı diyorum çünkü yazıyı yazdığım sırada yeni bir update çıkmış da olabilir. Lütfen kontrol ediniz ve takipte kalınız)Haydi gelin hiç vakit kaybetmeden işe başlayalım.

Enum Desteği

Enum tipi için Entity Framework tarafındaki desteği epeyce bekledik aslında. Bu desteğin gelmesi ile birlikte elbetteki Visual Studio 2012 IDE’ si de gerekli kolaylığı göstermekte. Model içerisine yeni bir Enum tipi eklenmek istendiğinde tek yapılması gereken, diagram üzerinden Add New –> Enum Type seçeneğini işaretlemek.

vsef_6

Bu işlemin ardından çıkan iletişim penceresinden, Enum tipine ait sabit değerleri girilir. Örneğin aşağıdaki şekilde görüldüğü üzere ülkeleri kullanabiliriz.

vsef_7

İstenirse harici bir assembly/isim alanı içerisinde yer alan Enum tiplerinin kullanılması da mümkündür. Bunun için Reference external type seçeneğinin etkinleştirilmesi ve [Namespace].[EnumTypeName] formatında ilgili tip adının girilmesi yeterlidir. Enum tipi oluşturulduktan sonra Model Browser penceresinde yer alan Enum Types kısmında görülecektir.

vsef_8

Enum tipleri için Designer tarafında bir destek yoktur(Şimdilik) ama bu pek de gerekli olmayabilir. Enum tipleri sonuç itibariyle sabitlerini sayısal olarak ifade etmektedir. Bu açıdan bakıldığında, bir Entity tip özelliğinin sayısal değerinin karşılığı olarak ilgili Enum sabitlerinin kullanılabilmesi de mümkündür. Örneğin Employee isimli bir Entity’ nin EmployeeCountry isimli int tipinden bir özelliğinin(Veritabanı tablosunda da bunun karşılığı alanın olduğunu varsayıyoruz) bulunduğunu düşünelim. Bu özelliği Country isimli Enum sabiti ile aşağıdaki şekilde görüldüğü üzere eşleştirebilir ve artık kod içerisinde yer LINQ sorgularında sayısal değer yerine Enum sabitlerini kullanabiliriz.

vsef_9

Kalabalık Diagramlardan Kurtulduk

Entity sayısının model üzerinde artması sonucu oluşan görsel kullanım güçlüğünü engellemenin yollarından birisi de, diagramları bölümlemektir. Bunun şu an için kullanışlı olan iki farklı tekniği mevcuttur.

Model Diagramın bölümlenmesinin sebeplerininin başında, kalabalık ve takibi zor olan, çok sayıda Entity içeren modeller yer almaktadır. Ancak tek sebep bu değildir. N sayıda Entity içeren bir model’ de sadece bir kaç Entity ile çalışıldığı durumlarda, bu senaryoya konu olan objeleri kolayca takip edebilme ihtiyacı da nedenler arasında gösterilebilir.

Diagram Bölümleme (Move Metodu ile)

Bu teknikte Model üzerinden başka bir diagrama alınmak istenen Entity’ ler seçilir ve Move to new diagram ile taşınması sağlanır. Örneğin Northwind veritabanı için üretilen model’ de yer alan bir kaç Entity objesini seçip, sağ tıklama sonrası açılan menüden Move to new diagram seçeneğini işaretleyerek söz konusu bölümlemeyi gerçekleştirebiliriz.

vsef_3

Bu işlem sonucunda seçilen Entity objeleri yeni bir diagrama alınacak ve bu değişiklik Model Browser penceresinden de izlenebilecektir. Aşağıdaki çıktıda görüldüğü gibi.

vsef_4

Bu teknikte dikkat edilmesi gereken en önemli nokta gerçek anlamda bir Move işlemi yapılmasıdır. Yani, taşınan Entity objeleri aslında kaynak diagram üzerinden silinirler. Eğer bu istenmiyorsa takip eden teknikten yararlanılabilir.

Farklı sayıda diagram kullanıldığı durumlarda bunları anlamlı şekilde isimlendirmekte önemlidir. AdventureWorks gibi veritabanlarını düşündüğümüzde, tabloların şema(schema) bazlı olarak tutulduklarını ve domain olarak ayrıştırıldıklarını görürüz.

Buna göre her domain için ayrı bir diagram oluşturmak, görsellik ve takip edilebilirlik açısından oldukça yararlı olabilir. Böyle bir vakada, parçalanan ana modele ait diagramları yine veritabanında olduğu gibi şema adları ile tutmak mantıklı olacaktır.

Diagram Bölümleme (Model Browser üzerinden)

Model Browser, Entity diagramlarının yönetilebildiği etkili dialog pencerelerinden birisidir. İstenirse bir modelin bölümlenerek farklı diagramlara taşınması/kopyalanması işlemi buradan da gerçekleştirilebilir. Bunun için öncelikli olarak Model Browser’ a yeni bir diagram ilave edilir.

vsef_5

Yeni bir diagram oluşturulduktan sonra yine Model Browser içerisinde yer alan Entity’ leri boş alana sürükleyerek söz konusu işlemi gerçekleştirebiliriz. Burada ne yazık ki bir diagramın içindeki öğeyi seçip başka bir diagrama sürükleme işlemi söz konusu değildir(En azından kullandığım Visual Studio 2012 sürümü için bu geçerli değildi) Bunun yerine örneğin NorthwindModel ismiyle duran öğe altından sürükleme işlemlerinin yapılması gerekmektedir.

Diagram bölümleme aslında görsel bir ayrıştırma anlamına gelmektedir. Bir başka deyişle diagram bazlı yapılan taşıma, kopyalama gibi işlemler modelin tip yapısını bozmaz.

Daha Renkli Bir Diagram

Malum pek çok veritabanı sistemi(özellikle Relational olanlar ve Enterprise çözümlerde kullanılanlar) oldukça fazla sayıda tablo, view ve Stored Procedure içermekte. Hal böyle olunca Entity modellerini içeren diagramların, Visual Studio IDE ortamında takip edilmesi de çok zor olabilmekte.

Diagramların bölünebilmesi özelliği haricinde Visual Studio 2012 ile gelen önemli özelliklerden birisi de, Entity objelerinin renklendirilebiliyor olması. Bu özellik sayesinde örneğin aynı isim alanına ait(veya aynı domain içerisinde yer alması gereken) Entity’ leri farklı şekillerde renklendirerek, diagramın hem göze daha hoş görünmesi sağlanabilmekte hem de algının daha da güçlendirilmesi mümkün olmakta. Bunun için bir kaç Entity objesini aynı anda seçip, özellikler penceresinden Fill Color’ ı set etmemiz yeterli olacaktır. Aşağıdaki ekran çıktısında bu kullanıma örnek bir görüntü yer almaktadır Winking smile

Renkli TV Versiyonu

vsef_1

Sıkıcı Olan Siyah Beyaz TV Versiyonu

vsef_2

Birden Fazla Stored Procedure Seçerek Eklemek (Batch Insert)

Entity Framework bilindiği üzere veritabanı tarafındaki Stored Procedure’ leri birer fonksiyon olarak model tarafına almaktadır. Pek tabi Database First modelin kullanıldığı senaryolarda, Model üretilirken Stored Procedure’ lerden istenilenlerinin seçilerek de ilave edilmesi istenebilir. Visual Studio 2012’ de bunun için ek bir seçenek getirilmiştir.

vsef_10

Entity Data Model Wizard üzerinde ilerlerken çıkan Import selected stored procedures and functions into the entity model seçeneği işaretlendiği takdirde, Stored Procedures and Functions kısmında seçilen yordamlar için gerekli fonksiyonların topluca üretildiği ve modele dahil edildiği görülecektir. Bu, Visual Studio 2010 da yapılan t anında tek bir Stored Procedure’ ü fonksiyonelleştirme aksiyonuna göre çok daha iyidir(Add->Function Import)

Varsayılan Olarak DbContext Türevli Entity Model

Code First Development yaklaşımının en önemli noktalarından birisi de POCO(Plain Old CLR Objects) dışından DbContext türevli bir Context tipinin kullanılmasıdır. Visual Studio 2012 arabirimi Entity Model’ lerin üretilmesinde artık varsayılan olarak Entity Framework 5 DbContext T4 Template’ ini kullanmakta ve buna göre de üretilen entity context sınıfı  DbContext türevli oluşturulmakta. Hatta, Entity sınıflarının da birer POCO tipi olarak üretildiğini görmekteyiz.

vsef_12

Bilindiği üzere Visual Studio 2010 bu konuda ObjectContext türevli bir yaklaşımı benimsemektedir. Ancak Entity Framework takımın uygulama geliştiricilere önerisi DbContext türevli içerik tipini kullanmaları ve POCO sınıfları ile ilerlemeleri yönündedir.

Property Sıralaması

Model diagramda yer alan Entity özellikleri varsayılan olarak veritabanındaki kolon sıralamasına göre gelmektedir. Ama istenirse bu özelliklerin sırası değiştirilebilir. Bunun için Alt+Yön Tuşu kombinasyonu kullanılabilir(Örneğin Alt+Up ile özellik bir üste, Alt+Home ile en başa, Alt+End ile en sona geçer) veya özellikler penceresinden aşağıdaki şekilde görüldüğü gibi ilerlenebilir. (Visual Studio 2010 IDE’ sin de bu işlem için XML tarafına geçmek gerekirdi)

vsef_11

Böylece geldik bir yazımızın daha sonuna. Bu yazımızda özellikle Visual Studio 2012 ile Entity Framework tarafına gelen yenilikleri incelemeye çalıştık. Çok doğal olarak çeşitli Extension’ lar yardımıyla Visual Studio 2012 ortamındaki Entity Framework niteliklerini arttırmak mümkündür. Bu yazımızda, varsayılan olarak gelen kabiliyetlere bakmaya çalıştık. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.

Yorumlar (15) -

  • Burak bey selamlar,

    bir sorum olacaktı. Peki EF içinde ENUM özelliklerini kullanırken çoklu dil yapısını nasıl belirleyebiliriz? Yani arayüzde bir combobox var ve bu combobox ı popülete eden metot EF entitsinin ENUM propertisine bakıyor, İngilizce seçiliyse CAR, TRAIN şeklinde ama Türkçe seçiliyse OTOMOBIL, TREN şeklinde arayüze yansımasını nasıl gerçekleştirebiliriz?
  • Kesin bir şey söyleyemesemde Çoklu Dil Sorumluluğunu dışarıda bir birime vermek daha doğru olabilir gibime geliyor. Örneğin MVVM gibi bir model söz konusu ise veya MVC kullanılıyorsa, Enum değerinin farklı dildeki karşılığının sanki View tarafında çözümlenmesi daha doğru olabilir.
    Nitekim UI tarafının çoklu dil desteği söz konusu olduğunda Resource dosyalarından sıklıkla yararlanıldığını biliyoruz.
    Bahsettiğiniz senaryoda da bu tip bir yaklaşıma gidilebilir. Tabi sanırım böyle bir durumda en büyük problemlerden birisi de senkronizasyon olacaktır.

    Ya da,

    Bu tip bir ihtiyaç için EF tarafında Enum kullanmak doğru olmayabilir. Yine tablo bazlı Entity' ler ile olaya yaklaşıp, kültüre uygun olan değerlerin Combo Box' a doldurulması isabetli bir hareket olabilir.

    Dilerseniz bir de Alt.Net grubunda bunu sorun. İnanıyorum ki iyi öneriler gelecektir.
  • yine güzel bir makale daha yazmışsınız hocam, son günlerde her gün birkaç tane makalenizi okurken buluyorum kendimi Smile
  • @Ahmet Teşekkür ediyorum. Faydalı olmasını dilerim. Umarım oluyorlardır da.
  • @Polat Teşekkür ediyorum. Bloğa da baktım biraz. Devam etmek lazım oradaki çalışmalara ;)

    @Arif Umarım bilgilendirici olmuştur. Ben Teşekkür ederim.
  • merhaba

    NorthWindDal.Customer ve NorthWindContainer.Models.Customer classları aynı propertylere sahip. Ben sorgularımda dönüş tipi olarak NorthWindContainer.Models altındaki classları kullanmak istiyorum(surrogate classlar). web projeme bu class lib'i referans verip sorgu dönüş tiplerini bilinir hale getirmeye çalışıyorum.

    bu durumda aşağıdaki dönüşümü nasıl yapabilirim

      (select new NorthWindContainer.Models.Customer yapmadan)

      List<NorthWindContainer.Models.Customer> a =
                            (
                             from c in ne.Customers
                             select c
                            ).ToList();

    aldığım hata
    Cannot implicitly convert type 'System.Collections.Generic.List<NorthWindDal.Customer>' to 'System.Collections.Generic.List<NorthWindContainer.Models.Customer>'  

    Teşekkürler
  • Sorguda eşitliğin sağ tarafından gelen tip NorthWindDal içerisindeki Customer tipi iken siz bunu Surrogate olan NorthWindContainer.Models altındaki Customer tipinden listeye atmak istiyorsunuz. Burada en azından new ile surrogate tipi oluşturup özelliklerine c' nin değerlerini atamayı deneyebilirsiniz. Aşağıdaki gibi;

    var result =
                             from c in ne.Customers
                             select new NorthWindContainer.Models.Customer{ CustName=c.CustomerName,Bolge=c.Region};

    gibi...

    Bu sorgu sonucu elinizde NorthWindContainer.Models altındaki Customer tipinden bir liste oluşacak ama özelliklerinin içerikleri NorthWindDal.Customer örneklerinden beslenecektir.
  • cevap için teşekkür ederim fakat sorumda da belirttiğim gibi "select new NorthWindContainer.Models.Customer" yapmak istemiyorum. yani ilgili tablo içinde 40 kolon varsa 40 kez atamamı yapacağım yandaki gibi CustName=c.CustomerName,Bolge=c.Region gibi. Bunun daha kolay bir yolu yokmudur ?

    ilgliniz için teşekkür ederim.
  • Merhaba

    @meraklı
    Automapper kullanırsan istedigin işlemi kısa yoldan gerçekleştirebilirsin.
  • @Automapper

    Automapper 'ı araştıracağım teşekkürler Laughing

    bana bir örnek verebilir misin ? örnek kod


  • Yeni okuma şansım oldu elinize sağlık hocam
  • Hey gidi delphi;
    El birliği ile öldürdüler...
    Delphi'nin 10-15 sene önce yaptığını bugün ancak yapabiliyorlar.
    Bunuda yenilik diye lanse ediyorlar.
    Hayırlısı.
  • Programcılıktan ilk kazandığım 125doları Delphi ile yazdığım bir uygulama ile elde etmiştim Smile Delphi' nin yeri ayrı ;)

Yorum ekle

Loading