.NET 6 MVC Core Uygulamasına Entity Framework Core Nasıl Kurulur ? [CodeFirst]

Bu makaleyi yazmamın sebebi, Entity Framework kurmak, .net framework uygulamalarındaki gibi arayüzden yapılamıyor malesef. Eski .NET Framework projelerine EF eklemek için hatırlarsanız, arayuzden projemize Ado.NET Entity Data Model diye bir item ekliyordun, next next diyerek, bizim için EF’yi Db Context’i Connection stringi vs olusturmasını sağlıyorduk.

Ancak ben eğitim verdiğim sınıflarda, öğrencilere ısrarla, boş bir projeye, sıfırdan, kod yoluyla entity framework kurmayı defalarca gösterdim. İşte onun meyvelerini şimdi toplayacaklar. Çünkü .net 6 projesine arayuzden ekleyebileceğiniz bir Ado.Net Entity Model item’ı yok 🙂 Herseyi mecburen kod yoluyla yapmak zorundasınız. Ve dikkat edilmesi gereken 1-2 ince nüans var. İşte bu adımları sıra sıra size gösteren yazımız burda devreye giriyor.

1-) appsettings.json dosyasında özel bir boğum açarak, connection stringimizi tanımlamamız gerekiyor.

Bunun için en son bulunan AllowedHosts değerinin sonuna bir virgül koyup alt satıra geçiyoruz. Çift tırnağı açıp C yazdığımızda zaten IDE bize, ConnectionStrings mi yazmak istiyorsun diyecektir. Tamamlamamıza yardımcı olacaktır.

ConnectionStrings dedikten sonra “: { şeklinde bir ifade ile süslü parantez açıyoruz. Çünkü, bir projede tanımlı birden fazla ConnectionStrings olabilir, 3-4 veri tabanı ile çalışan bir uygulama yazıyor olabilirsiniz. O yüzden içerisinde birden fazla değer alabilecek bir yapıda oluşturmuşlar.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "DefaultConnection": "Server:sunucu.com; Database=NET6; User Name=KULLANICIADI; Password=SIFRE; Trusted_Connection=true "
  }
}

2-) DbContext dosyamızı oluşturuyoruz

Yapımızın daha derli toplu olması için, projemize “Data” diye bir folder ekleyelim ve daha sonra bunun altına , Add New Item diyerek bir class oluşturalım. Class’ımızın adına (ben şuan northwind veritabanıyla çalıştıgım için ) NorthwindDbContext.cs veriyorum.

 

 

 

 

 

 

3-) DbContext classımızın ayarlamalarını yapıyoruz.

public class NorthwindDbContext:DbContext
   {
       public NorthwindDbContext(DbContextOptions<NorthwindDbContext> options):base(options)
       {
 
       }
   }

Class’ımızı DbContext ‘ten katılıyoruz. Bunu yaptıgımızda, bizim için otomatik tamamlamayacaktır ve altını kırmızı çizecektir. Burada CTRL+Nokta dediğimizde, bize alternatif olarak, EntityFrameworkCore kurayım mı diye soracaktır.

Buradan Microsoft.EntityFrameworkCore u seçip son sürümünü indir dememiz gerekiyor. Ardından yazmakta olduğumuz DbContext yazısı rengini bulacaktır 🙂

ardından ctor yazıp, tab tab yapıyoruz ve bizim için bir constructor metodunun oluşmasını sağlıyoruz. Burada eski .net framework’ten farklı olarak, constructor metodumuzun parametre kısmına bir bilgi girmemiz gerekiyor.

public class NorthwindDbContext:DbContext
   {
       public NorthwindDbContext(DbContextOptions<NorthwindDbContext> options) : base(options)
       {
 
       }
      
   }

Burada söylemeye çalıştığımız şey:

.Net Framework zamanında, ctor’umuzu sadece base ctor’dan kalıtıyorduk ve oraya “name=connectionstringAdı” gonderiyorduk. Bu ne anlama geliyordu ? Bizim DbContext classımız örneklendiğinde, asıl dbcontext sınıfının ctor’unu connetion stringimizle çalıştırsın ve bize bir nesne göndersin demekti.
Ancak buradaki çalışma şekli farklı. Burada, direkt oluşturmus oldugumuz NorthwindDbContext’in ctorunu, dışarıdan DbContextOptions alabilir hale getiriyoruz. ve aldıgımız option’ı da ana klasın ctor’una paslıyoruz.

Neden böyle yapıyoruz ?

Çünkü .NET 6’da program.cs diye bir yerin varlıgından bahsetmiştik. Biz uygulamamıza, program.cs içerisinde, ilerleyen adımlarda “senin bir db contextin olacak, onun adı da şu olacak bilgin olsun” diyeceğiz, kullanacağı özellikler de şunlar şunlar olacak diyip, options’ları oradan göndereceğiz.

4-) Program.cs nin ayarlanması

var builder = WebApplication.CreateBuilder(args);
 
// Add services to the container.
builder.Services.AddControllersWithViews();
 
builder.Services.AddDbContext<NorthwindDbContext>(options=>options.UseSqlServer);

Program.cs’de builder.Services.AddControllersWithViews() çağrısının hemen altına, bu programımızın bir db dontext kullanacağını belirtmemiz gerekiyor.

Yalnız burada options’tan sonra nokta koyup UseSqlServer dediğimizde, IDE altını çizecektir ve ctrl+nokta dediğimizde hiç birşey çıkartmayacaktır malesef 🙁 Burada gidip biliçli olarak Nuget Package Manager üzerinden bir paket indirmemiz lazım. Ya da konsol’dan install-package yazarak bir paket indirmemiz lazım. Nedir bu paketin ismi ? “Microsoft.EntityframeworkCore.SqlServer“. Önceki klasik .net Framework’unde bunu yapmamıza gerek kalmıyordu. EF’yi indirdiğimizde, sqlserver kullanımı ile alakalı kutuphaneleri arka planda çekiyordu yada kendi içerisinde barındırıyordu. Ancak sanırım, .net 5’den itibaren, platform bağımsızlığını daha bi ön plana çıkartmaya çalışan Microsoft firması, EFCORE ile birlikte zorla SqlServer özelliklerini indirtip, ayrıcalık tanımıyor, herkes benim için eşit diyor ve isteyen, istediği db’nin kutuphanesini kendisi indirsin diyor.

Package Manager’dan yada PM Console’dan “Microsoft.EntityframeworkCore.SqlServer” ‘ı indirdikten sonra, kodumuzu şekillendirmeye devam edebiliriz. Hala UseSqlServer’ın altı çizili ise şimdi artık CTRL+Nokta diyebilirsiniz ve size “Microsoft.EntityFrameworkCore”‘u using kısmına ekşyeyeim mi diye soracaktır. Seçip, yolumuza devam edebiliriz.

Ve işte bu noktada “UseSqlServer()” dediğimizde, tam bu noktada ona connection stringimizi söylememiz gerekiyor. Yani Sql Server Kullanacaksın, onu da bu connetion stringle kullanacaksın dememiz gerekiyor.

UseSqlServer( içerisine, direkt string olarak connection string yazarsak yine çalışacaktır. Ancak bu sefer appsettings.json kullanmamızın bir anlamı kalmayacaktır. O yuzden oraya bir komut yazarak, connection string’i appsettings içerisinden seçmesini sağlamamız gerekiyor.

 

var builder = WebApplication.CreateBuilder(args);
 
// Add services to the container.
builder.Services.AddControllersWithViews();
 
builder.Services.AddDbContext<NorthwindDbContext>(options=>options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnectionString")));

burada gordugunuz gibi, builder. dediğimizde onun Configuration kısmından getConnectionString metodunu çağırıyoruz ve içerisine appsettings json içerisinde belirlediğimiz connection string ismini gönderiyoruz.

5-) Mevcut veritabanından modellerimizi çekelim – Scaffolding

Bunun için PM Konsol’u açıp bir komut yazmamız gerekiyor. Bu komut şu şekilde :

Scaffold-DbContext [-Connection] [-Provider] [-OutputDir]

Çalıştırmak için kendi verilerimizle yazalım :

Scaffold-DbContext "Server=.\SQLEXPRESS;Database=Northwind;Integrated Security=True" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -f

Ve durun tahmin edeyim, şöyle bir hata aldınız değil mi ? 🙂

Burada dediği şey, aslında, Scaffold diye bir komut tanımadığı.. Bunu gidermek için, bir tane daha paket indirmemiz gerekiyor 🙂

O da Microsoft.EntityFrameworkCore.Tools bunu kurduktan sonra artık komut satırından gönderdiğimiz komutları algılar hale gelecektir. Hatırlarsanız benzer sorun, önceki versionlarda, ado.net entity data model ile EF kurulumu yaptığımızda, eski versionu indiriyordu ve girip guncelleme çekmek zorunda kalıyorduk ve sonrasında çalışır hale geliyordu.

Hiç yukarılara gitmeden, hazır PM Console ekranındayken hemen install-package komutu ile indirelim

install-package Microsoft.EntityFrameworkCore.Tools

Bunu kurduktan sonra, yukarıdaki Scaffold’u çalıştırdıgımızda o bizim için bütün tablolarımızın ve viewlarımızın modellerini oluşturacak. Ve artık EntityFramework’umuz kullanıma hazır.

 

Bundan sonra yapacağımız şey, yeni bir view oluşturup, yeni bir controller aracılığı ile, controller’dan view’a data gonderip, onu view içerisinde göstermek.. Sonrakı yazımda görüşmek üzere

 

Emre ÖZÇELİKEL , 23 belge yazmış

C#, .NET 7, MVC ve MAUI konularında öğrenmeye ve öğretmeye meraklı bir yazılım geliştiricidir. Kendi firması üzerinden, Türkiye'nin önde gelen firmalarına yazılım destek hizmetleri vermekle beraber, eğitim kurumlarında bu konularda yüz yüze eğitimler de vermektedir.

Cevap Gönderin