1. Giriş
1.1. Objectif
Belgenin PDF versiyonu |BURADA| adresinde mevcuttur.
Belgedeki örnekler |BURADA| adresinde mevcuttur.
Entity Framework, başlangıçta Microsoft tarafından geliştirilen ve şu anda açık kaynak olarak sunulan bir ORM (Nesne-İlişkisel Eşleştirici) [juillet 2012, http://entityframework.codeplex.com/]'dir. Bir ASP.NET dersinde, belirli bir web uygulaması için aşağıdaki mimariyi kullanıyorum:
![]() |
NHibernate [http://sourceforge.net/projects/nhibernate/] çerçeve, Entity Framework'ten önce ortaya çıkan bir ORM'tir. Çeşitli veritabanlarına bağlanmaya olanak tanıyan olgun bir üründür. ORM, [DAO] katmanını (Veri Erişim Nesneleri) ADO.NET konektöründen ayırır. ORM, konektöre yönelik SQL komutlarını gönderir. [DAO] katmanı ise ORM tarafından sunulan arayüzü kullanır. Bu katman ise ORM'e bağlıdır. Dolayısıyla, ORM'i değiştirmek, [DAO] katmanını da değiştirmek anlamına gelir.
Bu mimari, SGBD'teki değişikliklere karşı oldukça dayanıklıdır.
[DAO] katmanını doğrudan ADO.NET konektörüne bağladığımızda, SGBD'in değiştirilmesi [DAO] katmanını etkiler:
- SGBD'lerin hepsi aynı veri türlerine sahip değildir;
- SGBD'lerin birincil anahtar oluşturma stratejileri aynı değildir;
- SGBD'ler, özel SQL'lere sahiptir;
- [DAO] katmanı, belirli bir SGBD ile bağlantılı kütüphaneleri kullanmış olabilir;
- ...
ORM, ADO.NET konektörüne bağlı olduğunda, SGBD'i değiştirmek, ORM'in yapılandırmasını yeni SGBD'e uyacak şekilde değiştirmek anlamına gelir. [DAO] katmanı değişmez.
Spring.NET ve [http://www.springframework.net/index.html] çerçeveleri, bir uygulamanın katmanlarının entegrasyonunu sağlar. Yukarıda:
- ASP.NET uygulaması, Spring'den [DAO] katmanına ilişkin bir referans ister;
- Spring, bir yapılandırma dosyasını kullanarak bu katmanı oluşturur ve referansını döndürür.
Bu mimari, katmanlar aynı arayüzü sunduğu sürece katman değişikliklerine karşı oldukça dayanıklıdır. Yukarıdaki [DAO] katmanını değiştirmek, yeni katmanın eskisinin yerine örneklenmesi için Spring yapılandırma dosyasını değiştirmek anlamına gelir. Bu katmanlar aynı arayüzü uyguladığından ve ASP.NET katmanı bu arayüzü kullandığından, ASP.NET katmanı değişmeden kalır.
Böylece esnek ve ölçeklenebilir bir mimari elde etmiş oluruz. Bunu göstermek için, ORM ve NHibernate katmanlarını Entity Framework 5 ile değiştireceğiz:
![]() |
Bu işlemi birkaç adımda gerçekleştireceğiz:
- öncelikle birkaç SGBD örneği ile Entity Framework 5'i inceleyeceğiz;
- [DAO2] katmanını oluşturacağız;
- mevcut ASP.NET uygulamasını bu yeni [DAO] katmanına bağlayacağız.
1.2. Kullanılan araçlar
Testler, Windows 7 Pro işletim sistemi, Intel Core i7 işlemci ve 8 GB RAM belleğe sahip bir HP EliteBook dizüstü bilgisayarda gerçekleştirildi. Geliştirme dili olarak C# kullanacağız.
Bu belgede, tümü ücretsiz olarak temin edilebilen aşağıdaki araçlar kullanılmaktadır:
Geliştirme araçları:
- Visual Studio Express for Desktop 2012 [http://www.microsoft.com/visualstudio/fra/downloads];
- Visual Studio Express for Web 2012 [http://www.microsoft.com/visualstudio/fra/downloads].
SGBD SQL Server Express 2012:
- SGBD: [http://www.microsoft.com/fr-fr/download/details.aspx?id=29062];
- bir yönetim aracı: EMS SQL Manager for SQL Server Freeware [http://www.sqlmanager.net/fr/products/mssql/manager/download].
SGBD Oracle Database Express Edition 11g Sürüm 2:
- SGBD: [http://www.oracle.com/technetwork/products/express-edition/downloads/index.html];
- bir yönetim aracı: EMS SQL Manager for Oracle Freeware [http://www.sqlmanager.net/fr/products/oracle/manager/download];
- bir Oracle istemcisi: NET: ODAC 11.2 Sürüm 5 (11.2.0.3.20), Visual Studio için Oracle Geliştirici Araçları ile birlikte: [http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html].
SGBD MySQL 5.5.28:
- SGBD: [http://dev.mysql.com/downloads/];
- bir yönetim aracı: EMS, SQL, MySQL için Yönetici, Ücretsiz Yazılım [http://www.sqlmanager.net/fr/products/mysql/manager/download].
SGBD PostgreSQL 9.2.1:
- SGBD: [http://www.enterprisedb.com/products-services-training/pgdownload#windows];
- bir yönetim aracı: EMS SQL Manager for PostgreSQL Freeware [http://www.sqlmanager.net/fr/products/postgresql/manager/download].
SGBD Firebird 2.1:
- SGBD: [http://www.firebirdsql.org/en/firebird-2-1-5/];
- bir yönetim aracı: EMS SQL Manager for InterBase/Firebird Freeware [http://www.sqlmanager.net/fr/products/ibfb/manager/download].
LINQPad 4: LINQ (INtegrated Sorgu Dili) öğrenme aracı [http://www.linqpad.net/, http://www.linqpad.net/GetFile.aspx?LINQPad4.zip].
1.3. Kaynak kodlar
Aşağıdaki örneklerin kaynak kodları URL ve [http://tahe.developpez.com/dotnet/ef5cf] adreslerinde mevcuttur.
![]() |
Bunlar, [1] adlı Visual Studio 2012 projeleri olup, [2] adlı bir çözümde bir araya getirilmiştir. [databases] klasöründe, kullanılan her bir SGBD projesi için ayrı bir klasör bulunur. Bu klasörlerde, söz konusu SGBD projeleri için örnek veritabanını oluşturan SQL komut dosyaları yer alır.
1.4. Yöntem
Entity Framework 5 Code First'i keşfetmek için öncelikle şu kitaptan yola çıktım: Jon Galloway, Phil Haack, Brad Wilson ve Scott Allen tarafından yazılan ve Wrox yayınevi tarafından basılan "Professional ASP.NET MVC 3" kitabı. Bu kitabın örnek uygulamasında yazarlar, Entity Framework (EF) sürümünü kullanıyor. Bu sürümü bilmediğim için, daha fazla bilgi edinmek amacıyla internette araştırma yaptım. Böylece en yeni sürümün EF 5 olduğunu ve EF 4 ile uyumsuzluklar olduğunu öğrendim; çünkü EF 5 ile test edilen kitaptaki kodda derleme hataları ortaya çıkıyordu.
Daha sonra EF'i kullanmanın birkaç yolu olduğunu keşfettim:
- Model First: EF'in bu yaklaşımıyla ilgili pek çok makale bulunmaktadır; örneğin [http://msdn.microsoft.com/en-us/data/ff830362.aspx]. Bu makale şu şekilde başlamaktadır:
Özet: Bu makalede, .NET Framework 4 ve Visual Studio 2010 ile birlikte gelen yeni Entity Framework 4'ü inceleyeceğiz. Veritabanı tasarımını bir modelden yönlendirebileceğiniz ve hem veritabanınızı hem de veri erişim katmanınızı bu modelden bildirimsel olarak oluşturabileceğiniz öncülünden hareketle, model öncelikli bir bakış açısıyla bu aracın kullanımına nasıl yaklaşabileceğinizi ele alacağım. Model, verilerinizin varlıklar ve ilişkiler olarak temsil edilen tanımını içerir; bu da ADO.NET ile çalışmak için güçlü bir yaklaşım sunarak, model tanımı ile uygulaması arasındaki soyutlama yoluyla görevlerin ayrılmasını sağlar.
Bir ORM, veritabanı tabloları ile sınıflar arasında köprü görevi görür.
![]() |
Yukarıda,
- EF5 katmanının solunda, varlıklar olarak adlandırılan nesneler bulunur;
- EF5 katmanının sağında ise veritabanı tabloları bulunur.
![]() |
[DAO] katmanı, veritabanı tablolarındaki görüntü nesneleriyle çalışır. Bu nesneler bir kalıcılık bağlamında bir araya getirilir ve varlıklar (Entity) olarak adlandırılır. Varlıklarda yapılan değişiklikler, ORM katmanı sayesinde veritabanı tablolarına yansıtılır (ekleme, değiştirme, silme). Ayrıca, [DAO] katmanı, tablolara değil varlıklar üzerinde sorgu yapan bir LINQ to Entity (INtegrated Query Dili) sorgu diline sahiptir. Model First yöntemi, varlıkları grafiksel bir araçla oluşturmayı içerir. Her bir varlık ve onu diğerleriyle bağlayan ilişkiler tanımlanır. Bu işlem tamamlandıktan sonra, bir araç yardımıyla aşağıdakiler oluşturulur:
- grafiksel olarak oluşturulan varlıkları yansıtan çeşitli sınıflar;
- veritabanını oluşturmaya olanak tanıyan DDL (Veri Tanımlama Dili).
Bu yöntemle ilgili bulduğum örneklerin hepsi Visual Studio 2010 Professional ve ADO.NET Entity Data Model adlı bir model kullanıyordu. Bu modeli Visual Studio 2010 Professional ile test edebildim, ancak asıl hedefim olan Visual Studio Express 2012'ye geçtiğimde, bu modelin artık mevcut olmadığını fark ettim. Bu nedenle bu yaklaşımı terk ettim.
- Database First: Bu yöntemin başlangıç noktası, mevcut bir veritabanıdır. Bu noktadan hareketle, bir araç veritabanındaki tabloların varlık şemalarını otomatik olarak oluşturur. Burada da bulduğum örnekler, örneğin [http://msdn.microsoft.com/en-us/data/gg685489.aspx], Visual Studio 2010 Professional ve ADO.NET Entity Data Model adlı şablonu kullanıyordu. Bu nedenle, aslında en çok tercih ettiğim bu yaklaşımı da terk ettim. Mevcut bir veritabanının varlıklarını belirlemek için, bunları oluşturan bir araçla başlamak oldukça kolaydı.
- Code First: Varlıkları oluşturacak sınıfları kendimiz yazıyoruz. Bunun için EF'in işleyişi hakkında asgari düzeyde bilgiye sahip olmak gerekiyor. Visual Studio Express 2012 ile kullanılabilir olduğu için ben de bu yolu izledim.
Bunu öğrendikten sonra şu şekilde çalıştım:
- SQL Server Express 2012 için bir kod yazdım, çünkü en fazla örnek bu SGBD sürümü için mevcut;
- bu kodun hata ayıklamasını yaptıktan sonra, onu diğer SGBD sürümlerine (Firebird, Oracle, MySQL, PostgreSQL) uyarladım.
Burada farklı bir yol izleyeceğiz. Öncelikle SQL Sunucusu için tüm kodları açıklayacağım, ardından bunların diğer SGBD'lere uyarlanmasını anlatacağım. Bu uyarlama sürecinde aşağıdaki ayarlamalar yapıldı:
- veritabanlarının kendine özgü özellikleri vardır. Özellikle, belirli sütunların içeriğini otomatik olarak oluşturmak için Tetikleyiciler kullandım. Her bir SGBD'in bunu yönetme yöntemi kendine özgüdür;
- tablolardaki resim varlıklarının değişmesi mümkündür, ancak bu kasıtlı bir seçimdir. Tüm veritabanlarına uygun varlıklar da seçebilirdim;
- SGBD'in ADO.NET sürücüsü değişir;
- SGBD'e bağlantı dizesi değişir.
İzlenen süreç şöyledir:
- varlıklar ile veritabanı arasında eşleştirme. Veritabanının doldurulması;
- LINQ sorguları ile veritabanı dökümü;
- LINQPad, LINQ için bir öğrenme aracı;
- varlıkların eklenmesi, silinmesi ve değiştirilmesi;
- erişim rekabetinin yönetimi;
- bir işlemde kaydedilen kalıcılık bağlamı;
- kalıcılık bağlamı dışında bir varlığın değiştirilmesi;
- Eager ve Lazy yükleme;
- [DAO] katmanının oluşturulması;
- ASP.NET web katmanının oluşturulması.
1.5. Hedef kitle
Bu belge, yeni başlayanlara yöneliktir.
Bu belge, Entity Framework 5 Code First üzerine bir ders değildir. Bu konuda, örneğin O'Reilly yayınevinden çıkan Julie Lerman ve Rowan Miller'ın "Programming Entity Framework: Code First" adlı kitabını okuyabilirsiniz. Bu belge hiçbir şekilde kapsamlı olmayı amaçlamamaktadır; sadece bu ORM'i anlamak için kullandığım yaklaşımı açıklamaktadır. Bu yaklaşımın, EF5 ile ilgilenen diğer kişilere de faydalı olabileceğini düşünüyorum. Amacım bu çerçevenin ötesine geçmemektedir.
1.6. developpez.com ile ilgili makaleler
Yukarıda bahsedilen kitap referans olarak kullanılacaktır. Ayrıca, developpez.com'te Entity Framework'e adanmış makaleler de bulunmaktadır. İşte bunlardan birkaçı:
- "Entity Framework – Code First yaklaşımı", Haziran 2012 – Reward tarafından. Bu makale ile bu belge kısmen örtüşmektedir. Ancak, özellikle sınıf <--> tablo miras "eşlemesi" konusunda bazı noktalarda daha ayrıntılıdır;
- "Entity Framework'e Giriş", Aralık 2008, Paul Musso tarafından;
- "Entity Framework ile Sınıf Modeli Oluşturma", Nisan 2009, Jérôme Lambert tarafından;
- "Linq to SQL'in Sql ve Entity Framework'e Kıyasla Performans Ölçümü", Haziran 2011, Immobilis tarafından;
- "Entity Framework Code First: otomatik geçişi etkinleştirme", Haziran 2012, Hinault Romaric tarafından;
- "CRUD, Razor ve Entity Framework ile bir uygulama oluşturma", Mayıs 2012, Hinault Romaric tarafından;
- "Entity Framework: Code First Migrations'ı Keşfetmek", Haziran 2012, Hinault Romaric tarafından;
Yukarıda belirtildiği gibi, bu belge her şeyi kapsamamaktadır. Bazı eksiklikleri gidermek için yukarıdaki makaleleri okumak faydalı olacaktır. Araştırmam eksik olabilir. Unuttuğum yazarlar benden özür dilerim.




