İlk olarak bir Blank Solutuion Oluşturuyoruz.

Projemize ben EC Pro App ismini verdim ve OK dedim.

Bizi boş bir Solution Ekranı Karşılayacak. Şimdi adım adım klasörlerimizi sonrada proje library lerimizi ekleyerek devam edeceğiz.

 

Solution Üzerine Sağ Tıkla >> Add >> New Solution Folder ve eklediğiniz Folder’a isim vereceğiz.

 

Aşağıdaki gibi 4 Folder ekleyip gördüğünüz şekliyle isimlerindirebilirsiniz.

 

 

Bu Dört Katmanımızı oluşturduysak şimdi her katmanımıza bir Class Library yani bir proje ekleyeceğiz.

Oluşturduğumuz Klasör üzerine gelip Sağ Tıklıyoruz >> Add >> New Project diyoruz. Add Project Sayfasına bizi yönlendirecek.

 

Bu kısımda görüntüde gördüklerinizi aynen uyguladığınızda bir Proje yani Class Library oluşturmuş oluyorsunuz.

Oluşturulan Class Library nin en önemli özeliği başka projelerinize Import edebilmeniz ve kullanabilmenizdir.

 

Siz Yeni Projeyi eklediğinizde standart olarak Class1.cs dosyası oluşturulur. Bu Class Dosyasını üzerine Sağ Tıklayıp >> Delete diyoruz.

Gördüğümüz gibi sildik.

 

Şimdi sırayla diğer klasörlerimize aynı işlemi yaparak yeni bir Class Library ekleyelim.

Proje Dosyalarımızın İsimlerini Sırayla Yazacak Olursam

ECPro.Entity – ECPro.Data – ECPro.Business – ECPro.UI

Gelin biraz bu katmanların ne işler yapacağından bahsedelim. Code First’de Veritabanı tablolalarımıza karşılık gelen Entityler yani varlıklar DOMAIN katmanında tutulacak.

Yani şöyle örnek verelim.

SQL üzerinde veritabanınız üzerinde bir tablo oluşturdunuz diyelim. İsmi de Personal olsun. İşte bu tablomuuzun Code olarak tanımlamasını yapacağımız yer DOMAIN katmanı olacak.

DATA katmanı ise Migration, Context ve CRUD işlemlerimizin olduğu sınıfları içerecek.

Business

UI

Şimdi öncelikle gelin yapacağımız projenin Tablolarını ilişkişlerini öncelikle Paint üzerinde çizelim.

Projemizde 4 adet tablomuz var

DERS

ÖĞRENCİ

SINIF

ÖĞRETMEN

Aralarındaki ilişki mantığını anlamaya çalışalım.

DERS Tablosu ile Öğrenci Tablosunu ele alırsak yorumlama şeklimiz şu olacak;

Bir Dersi birden fazla Öğrenci Alabilir aynı zamanda 1 Öğrenci Birden Fazla Ders Alabilir yani buradan anlayacağımız üzere

ÇOKA ÇOK bir ilişki vardır.

Diğer Tablo Bağlantıları Anlatılacak.

DOMAIN Katmanına Entitylerimizi oluşturalım.

DOMAIN katmanındaki Projemiz üzerine Sağ Tıklayıp >> Add >> Class diyoruz.

Resimde belirtildiği Class seçili gelecek. Classımıza tablomuzun ismini veriyoruz. İngilizce olarak yapmakta her zaman fayda olduğunu düşünüyorum. O yüzden Öğrenci tablomuz için Student.cs Classını oluşturalım.

 

Class oluşturulduğunda public erişim belirteci ile beraber gelmez. Bu sınıfın tüm projede erişilebilir hale getirmek için public belirtecini ekliyoruz.

 

 

Burada kodlarla alakalı bir kaç özelliği belirtmekte fayda var.

Not: Kod ekranında Prop yazar iki kere TAB+TAB yaparsanız sizin için şöyle bir yapıyı otomatik oluşturacaktır.

Bu yapı oluştuktan sonra üzerinde istediğiniz değişikliği yapabilirsiniz. Oluşturacağınız Property’nin türünü ve ismini değiştirebilirsiniz. Get ve Set Kapsülleme işlemi için vardır.

 

Bir Entity oluştururken Property adının ID yada ClassnameID olan Property i EF otomatik olarak PrimeryKey olarak algılar ve atamasını yapar.

Yani yukarıdaki kodlarda da gördünüz gibi ID olarak yazsaydım o PK olacaktı. Yada Sınıfın ismi olan Student ismine ID ekleseydim o PK olacaktı.

Soru: PK yı kendim farklı bir Property’e set edemem mi?

Tabi ki edebilirsiniz. Bunun için yapmanız gereken işlem şu olacaktı.

PK olacak Property’nin üzerine [KEY] yazmanız yeterli olacaktır. Ancak SS üzerinde de gördüğünüz gibi KEY altı kırmızı ile seçili eksik bir şeyler var.

Bu yapılacak işlem Entity Framework(EF) kütüphanesinden yönetildiği için bu projemize EF nin son sürümünü yüklememiz gerekmektedir.

NUGET PACKAGE MANAGER Kullanarak Projeye İnternet Üzerinden Package Yükleme

NUGET Manager Visual Studio projelerinize internet üzerinden dosya indirme ve yükleme eklentisi. Projelerimizde kullanabileceğimiz pek çok Package’ı geliştiriyorlar sürekli. Bunlara NUGET üzerinden erişim sağlayıp projemize dahil edebiliyoruz.

Şimdi yapmamız gerekenlere geçelim.

DOMAIN katmanında Projemize Sağ Tıklayalım >> Manage NuGet Packages…

Adım Adım Resimleri Takip ederek EF’yi kurabilirsiniz.

Projemize EF yi eklediğimize göre Şimdi KEY de var olan hatamıza bir daha göz atalım.

Hala hatanın durduğunu görüyoruz. Çünkü gerekli DLL i hala using diyerek projemize dahil etmedik.

KEY belirtecini yöneten kütüphanemiz şudur;

Bunu eklediğimizde hatanın giderildiğini göreceksiniz.

Ancak böyle durumlarda kodu hatırlayıp hangi kütüphaneye ait olduğunu hatırlamayabiliriz. Böyle durumlarda Kırmızı çizili kodun üzerine bir süre gidip beklediğimiz de hemen SOL tarafında bir Ampul belirir. Yan tarafındaki OK a tıklayarak olası çözümleri görebiliriz.

Gördüğümüz gibi hangi kütüphane eklenirse çözüleceğini söylüyor. O düzeltmenin üzerine çift tıkladığınızda sizin için otomatik olarak bu kütüphanenin eklediğini göreceksiniz.

Şimdi diğer Entitylerimizi aynı şekilde sırayla oluşturalım.

ForeignKey lerimizi oluşturmadan ilk tablo hallerine bir bakalım.

Student.cs

Lesson.cs

Instructor.cs

Classroom.cs

Şimdi sıra geldi tablo ilişkilerimizi kod ile oluşturmaya. Ben sizlere basit olan yöntemi anlatmaya çalışacağım.

İlk olarak Student classımızı ele alalım.

İlk tablo ilişkilerimizi oluşturduğumuz çizimimize bir göz atalım.

Öğrenci ile Ders arasında ÇÇ

Öğrenci İle Sınıf Arasında TÇ

ilişki mevcuttur.

Çoka çok olmasının anlamı nedir?

1 Öğrenci 1 Den Fazla Ders Alabilirken.

1 Dersi 1 Den Fazla Öğrenci De alabilir.

Şimdi Student.cs dosyamızı açalım ve şu kodu ekleyelim.

Bu kod standart bir kodlama olup Öğrencinin dersle olan ÇÇ ilişkisini anlatır. ICollection yerine List de yazabilirdiniz. Ancak zaten List ICollection dan kalıtım aldığı için bir şey değişmeyecektir.

Bir ICollection property’si oluşturduk. Bağlantılı olduğu tablo ne ise onu ICollectiona parametre olarak verdik.

Yorumlamamız aynen şu şekilde olmaktadır. 1 Öğrencinin 1 den Fazla Dersi olabilir. Bu derside ancak bir liste ile alabiliriz. O zaman ICollection yada List kullanalım.

Şimdi TÇ ilişkide olduğu sınıf tablosu ile bağlantısını oluşturalım.

Sadece bir sınıf oluşturarak bu TÇ ilişkiyi gösterebildik.

Yorumlamasına bakacak olursanız 1 Öğrenci Sadece 1 Sınıfta bulunabilir. O yüzden alınabilecek herhangi bir toplu değer olmadığı için sadece bir sınıf tanımlaması ile bunu gerçekleştirdik.

Şimdi Student Class ı için bir Constructor oluşturalım. Kodlamamızı görüp açıklaması ile devam edelim.

Şimdi olayı şöyle açıklayalım. Bu sınıf farklı bir Class içinde çağırılıp çalıştırıldığında içerisinde oluşturulan List tipli yapıların kendisinden bir instance alınmadan kullanımına izin verilmeyecektir. Projenin birden fazla yerinde bu sınıfa ihtiyac duyduğumuzda içerisindeki sınıflar içinde instance oluşturmamız gerekecekti. Bunu takip etmek gerçekten çok zor olacaktır.

O yüzden Constructor içinde bu instancelarımızı oluşturuyoruz.

ICollection tipli Lessons Property si için gördüğünüz şekilde bir HasSet oluştururarak bir instance oluşturabiliriz. Bunu List olarakda oluşturabilirdik hiç bir farkı olmayacaktır.

Şu anda Student Classımız için gerekli ilişkileri oluşturduk. Şimdi aynı işlemleri aynı bakış acısıyla tek tek diğer classlar için yapalım.

Classroom.cs

Kısaca bir yorumlayalım. Oluşturduğumuz Paint dosyasına dönüp baktığımızda

Classroom ile Instroctur arasında ÇÇ ilişki var. Yani bir Sınıfta birden fazla öğretmen ders verebilir. ICollection (IC)

Classroom ile Lesson arasında ÇÇ ilişki var. Yani bir sınıfta birden fazla ders verilebilir. IC

Classroom ile Student Arasında ÇT ilişki var. Yani bir sınıfta birden fazla öğrenci bulunabilir. IC

Bu yorumlamalarımızdan dolayı ilişkiler aşağıdaki gibi oluşturuldu.

Bütün IC lerden instance oluşturulmalı bunun içinde Constructor(Ctor) içinde bunlar oluşturulmalı.

Şöyle bir ayrımı kullanıyorlar kullanmasanız bir şey farketmez. Ama tablo yapısını bakarak anlamak için iyi bir belirteç oluyor. TÇ tablolarının instance alırken List tipli oluşturuyoruz. ÇÇ tipli tablolarımızı HasSet tipli oluşturuyoruz. Bu da çok kişi çalıştığımız yazılım projelerinde kod yazan arkadaşımızı tasarımcımızı anlaması açısından işlerini kolaylaştırıyor.

Hadi gelin diğer classlarımızı tamamlayalım.

Instructor.cs

Eğitimen Sınıf ile ÇÇ ilişkisi var. Bir Eğitmen birden çok sınıfa girebilir.

Eğitimen Ders İle ÇÇ ilişkisi var. Bir Eğitmen birden çok ders verebilir.

Bunun için ilişkilerin tipi IC olacaktır.

Instanceları da HashSet ile oluşturulacaktır.

Lesson.cs

Lesson Studet ile ÇÇ ilişkili. Yani bir dersi birden fazla öğrenci alabilir.

Lesson Instructor ile ÇÇ ilişkili. Yani bir dersi birden fazla eğitimen verebilir.

Lesson Classroom ile ÇÇ ilişkili. Bir ders birden fazla sınıfta verilebilir.

Bu yüzden tablo ilişkişeri tümünün IC olacaktır.

Intanceları oluşturulurkende tipleri Hashset olacaktır.

DOMAIN katmanındaki işimiz bitti. Şimdi DATA katmanına geçelim.

Öncelikle bu katman nedir ne iş yapacak ona bir bakalım. Tablo Entitylerimiz Domain katmanında oluşturuldu. Data katmanı ise EF yapısı ile bu tarafta oluşturulan sınıflar yardımı ile DOMAIN katmanıyla haberleşip Contextlerimizi oluşturup EF yapısı Entitylerimizi ADO.Net kodlarına dönüştürüp fiziksel veritabanımızın oluşturulmasını ve veri aktarımı gibi işlemleri yapacak.

Bu katmanda da EF sınıflarına ihtiyacımız olduğu için ilk olarak bu proje dosyamıza NUGet yardımıyla EF’yi yükleyelim.

 

 

Şimdi Repostroies ve Context klasörümüzü oluşturmaya.

Context klasörü üzerinde bir context classı oluşturalım.

Şimdi gelin bu ECProContext classımızı işlerimizi yapabileceği şekilde düzenleyelim.

Bu sınıfın istediğimiz işleri yapabilmesi için EF içinde bulunan DBContext sınıfından kalıtım alması gerekir.

Bu kalıtımı alabilmemiz için öncelikle şu kütüphaneyi projeye dahil etmemiz gerek.

Şimdi kalıtım ifademizi yazalım.

Classımızı ilk oluşturduğumuzda aşağıdaki gibidir.

Eklememiz gereken ifadeler.

 

Artık bu sınıfımız bütün DbContext özelliklerini kullanabilecek.

Tabi ilk olarak çalıştırıldığı anda veritabanımızın oluşmasını isteyeceğimiz için Constructorında bunu yapacağız.

Metotlarımızda kalıtım alabiliyor bildiğimiz gibi. Burada

:base() ifadesiyle DbContext sınıfının base metodundan kalıtım almış olduk.

Base metoduda şudur.

Buradan anlıyoruz ki metod string türde bir connection string istiyor. Şimdi biz istersek buraya connection string in tam halini aynen yazabiliriz. Ancak böyle yapmayacağız. Büyük projelerimizin yönetimini daha kolay hale getirmek için Connection string i AppConfig dosyayı içine yazacağız.

Kod içinde bulunan ECProDB nin ne olduğunu AppConfig i yazdıktan sonra daha iyi anlayacağız.

Şimdi AppConfigi açalım.

Kodları alabileceğiniz şekilde de verelim.

Bizim eklediğimiz bölüm.

Şimdi bu yazdığımız kodu ele alalım.

Öncelikle bir connectionString oluşturacağımız için

<connectionStrings> </connectionStrings> tagleri açıp kapadık.

Daha sonra arasına ekleme anlamına gelen <add/> tagini ekledik.

Bu tagin alabileceği parametreler var.

name=”ECProDB” 

bu CS yi istediğimiz yerden bu isimle çağırabiliriz. Buraya kolayınıza nasıl geliyorsa öyle isimlendirebilirsiniz.

Daha sonra

connectionString=”server=DESKTOP-E51U7VA\SQLEXPRESS;database=ECProDB;trusted_connection=true” providerName=”System.Data.SqlClient”

 

server=DESKTOP-E51U7VA\SQLEXPRESS; 

Bu kısım bağlanacağımız Server’ın adını gösteriyor. Eğer uzak bir sunucuya bağlanacaksanız buraya sunucunuzun IP adresini yazmanız gerekir.

Bu servername i nasıl alabilirsiniz.

SQL Managament ı çalıştırın. Resimde gösterdiğim adresi alabilirsiniz. Siz sizinkini yazmalısınız.

database=ECProDB; 

Burada SQL üzerinde oluşacak Database in ismini veriyoruz. İstediğiniz şekliyle isimlendirme yapabilirsiniz. Ancak daha önceden o Database in olmadığına dikkat ediniz.

 

trusted_connection=true

Bağlantımızın şifresiz bir şekilde oluşturabilcemizi yukardaki ifade ile anlattık. Eğer bağlatımızın UserName ve Password ile girmemiz gerekseydi bunları buraya tanımlamamız gerekecekti.

 

Son olarak da Provider’ı belirtiyoruz.

providerName=”System.Data.SqlClient”

Şimdi AppConfig dosyamızı ayarladığımıza göre Context classımıza tekrar dönelim.

Şurada bahsedilen ECProDB string ifadesi Config dosyasındaki ConnectionStringimizin Name ini işaret eder. O Name Sayesinde CS ifadesini çekebilecektir.

Böylelikle bu sınıf çağırıldığında veri tabanımız oluşacaktır.

Şimdi sıra geldi bu class üzerinden hangi tablolarımızın bu veritabanı üzerinden işleneceğini belirtmeye.

Bunun için tüm Entitylerimiz için DBSet ler oluşturacağız.

 

Şimdi sırada Migration İşlemlerini yaparak Database’imizi fiziksel olarak oluşturmak var.

Öncelikle Package Manager Console Ekranını açıyoruz.

Console açıldı.

İlk olarak hangi katmanda Migration işlemlerini yapmak istiyorsak o katmanı seçiyoruz.

Şimdiki işlemimiz Migration’ı aktif etmek olacak.

Enable-Migrations

Yazıyoruz ve Enter’a basıyoruz.

İşlem başarılı bir şekilde tamamlandığında DATA katmanında bir Migrations Klasörünün oluştuğunu göreceksiniz.

Burada Configuration.cs dosyasına tıklayıp kodlara bakalım.

Bundan sonra yapılacak Tablo değişikliklerini ve eklemelerini otomatik olarak veritabanına işleyebilmesi için işaretlediğimiz false ifadesini true ile değiştiriyoruz.

Şimdi Tekrar Console Ekranına dönüp bir Migration ekleyeceğiz.

Migration oluşturulan Database farklılıklarını takip etmek için oluşturulan bir Maping History aslında.

Şunu yapacağız.

Add-Migration

Add-Migration ifadesinden sonra o anki Migration’a durumla alakalı ipucu verecek şekilde istediğiniz ismi verebilirsiniz.

Şu anda veri tabanını ilk defa oluşturacağımız için Kurulum ismini verdik.

Enter’a bastığımda işlem bir süre sürecek ve tamamlanacaktır.

Başarılı bir şekilde oluşturuldu.

Klasör yapımıza baktığımızda Kurulum isimli bir Class ın oluştuğunu görüyoruz.

 

Bu Migration dosyasına bir göz attığımızda aslında EF’nin tam olarak ne yaptığını anlamamıza yardımcı olacak.

 

Bu kodlamadan bir tane tablo yapısını ele alıp inceleyelim.

Bizim sadece Entityler üzerinde birkaç satır kodlama ile yaptığımız şeyi şu anda EF yorumladı ve bir ara sorgulama diline çevirdi. Kendi anlayacağı bir Sorgulama diline çevirdi. Birazdan yapacağımız Update-Database işlemiyle EF buradaki kodları ADO.Net yapısına çevirecek ve fiziksel olarak veri tabanının oluşmasını sağlayacak.

CreateTable ile bir tablo oluşturulacağı bildirildi.

dbo.Classroom bu tablonun ismi.

İki tane Propertymiz vardı yani kolonumuz onlarında oluştuğunu görüyoruz.

Son olarak da PrimartKey olan kolonun belirtilmesi ile tablo oluşmuş oldu.

Son adım artık her şeyimiz hazır bu işlemleri server üzerine aktarmak kaldı.

Console Manager’ı açıp

Update-Database

işlemini uyguluyoruz.

Gelin bakalım SQL Managament’ı açalım ve gerçekten veri tabanımız istediğimiz gibi oluşturulmuş mu buna bakalım.

Evet veri tabanımız tam da istediğimiz gibi oluşturulmuş. Gördüğünüz üzere bağlantı tablolarını da oluşturduğunu görüyorsunuz.

Birde bağlantılarımızın nasıl oluştuğuna bakalım.

 

 

 

Her şey tamda istediğimiz gibi.

Bunları da yaptığımıza göre şimdi sıra geldi CRUD işlemlerimizi yapmak için her Tablomuz için bir DataManager classı oluşturmaya.

Sorgularımız bu classlar üzerinden yönetilip DOMAIN katmanı ile ilişki kuracak ve gerekli data ekleme silme güncelleme ve listeleme işlemleri yapılacak.

 


muratbilginer