Entity Framework Core 5 / Code First Yaklaşımı İle Kurulumu

Mehmed Emre AKDİN
SDTR

--

Merhaba Arkadaşlar.

Bugün sizlere bir ASP.NET Core projesinde Code First yaklaşımı ile Entity Framework Core nasıl ayağı kaldırılır bunu örneklendirerek anlatmaya çalışacağım.

Entity Framework nedir?

Öncelikle Entity Framework nedir buna değinmek istiyorum. Entity Framework, Microsoft tarafından geliştirilen ORM aracıdır. Temel olarak uygulama ve veritabanı arasında köprü görevi gören bir araçtır.

Peki ORM nedir?

Object Relational Mapping(ORM), nesne dayalı programlama paradigması kullanarak bir veritabanındaki verileri sorgulamamıza ve değiştirmemize olanak tanıyan bir tekniktir. Veritabanındaki tabloları, sınıflara çevirir bu sayede kod yazarken veritabanında daha az zaman harcarız. Daha az SQL sorgusu yazmamıza olanak sağlar. Buna bağlı olarak uygulama geliştirme maliyetini düşürür. Fakat performans açısından doğrudan saf SQL kullanmaya göre gözle görülür bir fark mevcuttur. Bu fark Entity Framework’te daha fazlayken Entity Framework Core için daha azdır. Tabi kodu yazan kişinin elindeki performans kriterlerini nasıl değerlendirdiğide durumu oldukça fazla etkilemektedir.

Code First nedir?

Code First yaklaşımı basit olarak sınıflar ile veritabanımızı oluşturmamızı sağlar. Yani modelimizi C # veya VB.Net sınıflarını kullanarak tanımlamanıza olanak tanır. Code First yaklaşımı genelde var olmayan bir veritabanını hedeflemektedir. Fakat boş bir veritabanımız elinizde mevcutsa kullanılabilir ve ardından Code First ile ona yeni tablolar ekleyebiliriz.

ASP.NET Core Projesi Oluşturalım

Asp.Net Core Web Application diyerek boş veya default olarak model-view-controller’un bulunduğu bir proje açıyoruz. Ben boş bir Asp.Net Core projesi üzerinden devam edeceğim.

Ardından Startup.cs dosyasına gelip ConfigureService kısmına:

services.AddControllersWithViews();

diyerek controller ile view kullanacağımızı belirtiyoruz. Ardından Configure kısmına gelip Use.Endpoints middleware’inin içine ön tanımlı rota yapılanmasını kullanmak istediğimizi belirtiyoruz:

app.UseEndpoints(endpoints =>
{
//{controller=Home}/{action=Index}/{id?}
endpoints.MapDefaultControllerRoute();
});

Gerekli Kütüphanelerin Yüklenmesi

Önemli Not:

Bu bölümdeki eklenecek kütüphanelerin hepsi bizim tasarlıyacağımız uygulamada bizim oluşturduğumuz DataAccessLayer katmanına yüklenecektir. Çünkü biz ilgili context ve migration ayarlarını bu katmanda yapacağız.

Gerekli kütüphanelerin hepsini NuGet Packet Manager’dan yükleyeceğiz:

Database provider olarak SQL Server kullanacağım.

SQL Server kurulumu için NuGet Packet Manager’dan:

Microsoft.EntityFrameworkCore.SqlServer

Gerekli Migration işlemleri için NuGet PacketManager’dan:

Microsoft.EntityFrameworkCore.Tools

DbContext için ise NuGet PacketManager’dan:

Microsoft.EntityFrameworkCore

paketini yükleyeceğiz.

Yüklenenler kısmına hızlı bir şekilde göz atalım:

Evet herşey güzel görünüyor. O zaman devam edelim.

Gerekli Tabloların Oluşturulması

Örneği kısa tutmak adına çok basit iki tablo oluşturacağım. Bunlar satış işlemi yapan personeller için “Personel” ve sattıkları ürünleri tutmak için “Product” tablosu olacaktır. Personeller birden fazla ürün satabilecekler fakat ürünler yalnız bir personel tarafından satılabileceklerdir. Yani tablolarımız arasında birin çoğa ilişkisi söz konusu olacaktır.

Entitylerimi ve Contexti’mi ayrı katmanlarda tutmayı planlıyorum. Fakat diğer katmanları projeye dahil etmiyeceğim. Sadece “Data Access Layer” ve “Entities” katmanı ile ile yolumuza devam edeceğiz. Çünkü buradaki asıl amacımız kurumsal bir mimari kurmak değil Entity Framework Core’un code first yaklaşımı ile nasıl ayağı kaldırılacağıdır.

Kodlamaya geçmeden önce bir “Controllers” klasörü altında “HomeController” controller’ı oluşturuyorum. Ve birde bu controller’a ait bir “Index.cshtml” dosyası oluşturuyorum. Eklenen paketler ve startup.cs’deki değişiklikler doğrultusunda projemi derliyorum. Kusursuz bir derleme işleminden sonra tablolarımı oluşturmak üzere entitylerim için ayrı bir “Entities” isimli katman oluşturuyorum.

Solution üzerine sağ tıklayıp aşağıdaki resimde görüldüğü üzere new project diyorum:

Class Library(.NET Core) ‘u seçtikten sonra Next diyerek devam ediyorum:

Son olarak library adımı “Entities” koyarak “Entities” katmanını oluşturuyorum.

Enities Katmanı altında “Entity” isimli klasörümü oluşturarak devam ediyorum. Ve bu klasör içine ilk sınıfım olan “Person.cs” sınıfını oluşturuyorum.

Sınıf içerisindeki üye değişkenlerimin yani veri tabanınına attribute olarak map edilecek değişkenlerimin validasyonu için “Data Annotation” yöntemini kullanacağım. Siz tercihiniz doğrultunuzda “Fluent API” ’de kullanabilirsiniz.

Person.cs

Product.cs

Sıra geldi “Data Access Layer” ’ımızı oluşturmaya. “Data Access Layer” ‘ı ve context sınıfımızın da yer alacağı “Context” klasörünü oluşturalım. Son olarak “Context” klasörümüzün içinde de “DatabaseContext” isimli sınıfımızı oluşturalım.

Dosyalama yapımızın son hali aşağıdaki şekilde olacaktır:

“DatabaseContext” sınıfımının tasarımı aşağıdaki şekilde olmalıdır:

Öncelikle “DatabaseContext” sınıfımızın bir context sınıfı olması için “DbContext” ‘ten türemesi gerekmektedir. Daha sonra veri tabanındaki tablolarımızı temsil eden DbSet’ler oluşturulur. Ve son olarak kullanılacak veri tabanını yapılandırmak için “OnConfiguring” metodu “DbContext” sınıfından override edilir. Sql server kullandığımız için “optionsBuilder.UseSqlServer()” diyerek gerekli veri tabanı ayarlarımızı vererek işlemler sonlandırılır.

Veri Tabanının Ayağa Kaldırılması

“Package Manager Console” ’ u açıyoruz. Açmayı bilmeyenler aşağıdaki görsele bakabilir:

Gerekli işlemleri yapmadan önce dikkat etmemiz gereken bir husus var. Context’imizi içeren katmanın yani “Data Access Layer” ‘ın seçili olduğundan emin olmanız gerekiyor. İlgili yerden gerekli katmanı seçiyoruz:

Ve son olarak ilgili katmanımız üzerine gelip “Set as Startup Project” diyoruz.

“Package Manager Console” ’ a aşağıdakileri sırayla yazıyoruz:

Add-Migration MigrationName — -> Migration’ı oluşturur

Update-Database — -> Migration’a göre veri tabanını oluşturur.

İşlem sonucunda bir hata alıyorsanız yazdıklarımı dikkatlice gözden geçirmenizi öneririm. Şimdi Microsoft SQL Server Management’a gidip veri tabanımın oluşup oluşmadığını kontrol ediyorum.

Veri tabanımızın başarılı bir şekilde oluştuğunu görüyoruz.

Sıra geldi bir test verisi eklemeye ancak burada bir şeyi tekrar belirtmek istiyorum. Buradaki amacım katmanlı bir mimari oluşturmak değildir. Bu yüzden yok efendim “Data Access Layer” ’ da neden concrete’ler yok. “interfaceler nerede?” “data access layer’dan UI katmanına hiç erişilir mi? demeyin. “E o zaman neden gereksiz yere katman oluşturdun hiç oluşturmasaydın?” dediğinizi duyar gibiyim. Katmanları oluşturdum çünkü ayrı bir katmanda kurulum yaparken nelere dikkat etmemiz gerektiğini göstermek istedim. Yeterince açıklayıcı olduğumu düşünerek test verisini ekleyip yazımı sonlandıracağım:

Unutmadan UI katmanımıza tıklayıp “Set as Startup Project” diyelim. Aksi takdirde projemiz başlamıyacaktır. Çünkü veri tabanını kurarken başlatılacak katmanı “Data Access Layer” olarak seçmiştik.

Projeyi derleyip veri tabanımı açıyorum:

Evet! Güzel görünüyor ha? :D Her şey bittiğine göre yazımızın da bitme vakti geldi demektir. Eğer gözümden kaçan yazım hatası veya anlatım bozukluğu olduysa şimdiden kusuruma bakmayın. Yazım umarım faydalı olmuştur. Okuduğunuz için şimdiden teşekkür ederim. Bir sonraki yazıda görüşmek üzere!

--

--