Mini Dükkan Projesi Ders 004 Database Migration İşlemleri

Bu yazımda biraz düzeltme ile başlamak istiyorum arkadaşlar; projemde yer alan MiniDukkanContext classıma gidiyor ve kodlarımın son halini aşağıdaki şekilde düzenliyorum.

Ayrıca bu ders için ilgili videoyu da izleyebilirsiniz:

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MiniDukkan.Models
{
    public class MiniDukkanContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("server=DESKTOP-FIUL2TU\\SQLEXPRESS; database=MiniDukkanDB; Trusted_Connection= True");
        }
       
        public MiniDukkanContext(DbContextOptions< MiniDukkanContext > options) : base(options)
        {

        }

        public DbSet< Urun > Urunler { get; set; }
    }
}

Daha sonra appsettings.json tarafında kodlarımı aşağıdaki şekilde düzenledim;

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": { "MiniDukkanConnection": "server=DESKTOP-FIUL2TU\\SQLEXPRESS; database=MiniDukkanDB; Trusted_Connection= True" }

  }

Database Migration Oluşturma

Entity Framework Core migration adını verilen özelliği aracılığı ile veri modeli sınıflarını kullanarak veritabanı için şema oluşturabilmektedir. Bir migration hazırladığımızda, Entity Framework Core veritabanını hazırlamak için gerekli SQL komutlarını içeren bir C# sınıfı oluşturur. Eğer model classlarım üzerinde yeni bir modifiye yapma ihtiyacı duyarsam, bu sefer ilgili değişiklikleri veritabanıma yansıtabilmek için yeni bir migration oluşturmam gerekir. Migration vasıtası ile artık veritabanı kısmında SQL kodlarını yazmaktan kurtuluyorum aslında. Böylelikle sadece uygulamam içinde yer alan model classlarıma odaklanarak veritabanı kısmını da migration ile çözüyorum.

Şimdi öncelikle veritabanımızı oluşturmak için Package Manager Console’da aşağıdaki komutu yazıyorum.

add-migration InitialMiniDukkan

Bu komut ile veritabanımı ilk kullanım için hazırlamış oldum. Bu komutu yazdıktan sonra projemde Migrations klasörü oluşturuluyor. Benim bundan sonra oluşturacağım tüm migration sınıflarım bu klasör altında yer alacak. Migration isimlendirmede migration oluşturulduğu zaman ve akabinde add komutunun ardından verdiğimiz isim önünde yer alan alt çizgi ile eklenerek oluşturulur. Bizim şu an oluşturduğumuz initial migration classında veritabanı için başlangıç şeması oluşturuldu ve Urun modeli sınıfımızda bu şema içinde kullanıldı.

Migrations oluştu ama tabi database tarafıma henüz bu durumu bildirmedim. Bunu yapmam gerekiyor bunun için package manager console kısmında aşağıdaki kodu yazıyorum.

update-database

Böylelikle database kısmında veritabanımda oluşmuş oldu. Görüleceği üzere tablomuzda var.

Şimdi biraz uygulamamızda ham veri olsun istiyorum ben, dolayısı ile Models klasörü altında bir class ekliyorum ve adını HamData.cs verdim şimdilik. Dükkanımız bir oyuncakçı olsun. Bu classıma aşağıdaki kodları yazıyorum;

using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MiniDukkan.Models
{
    public static class HamVeri
    {
        public static void VeriDoldur(IApplicationBuilder app)
        {
            MiniDukkanContext context = app.ApplicationServices.CreateScope().ServiceProvider.GetRequiredService< MiniDukkanContext >();

            if(context.Database.GetPendingMigrations().Any())
            {
                context.Database.Migrate();
            }

            if(!context.Urunler.Any())
            {
                context.Urunler.AddRange(
                    new Urun
                    {
                        UrunAd = "Çıngırak",
                        Aciklama = "Bebek çıngırağı boncuklu",
                        Kategori = "Bebek Oyuncakları",
                        Fiyat = 15
                    },


                    new Urun
                    {
                        UrunAd = "Oyun Halısı",
                        Aciklama = "çıngıraklı, aynalı, müzikli oyun halısı",
                        Kategori = "Bebek Oyuncakları",
                        Fiyat = 150
                    },

                    new Urun
                    {
                        UrunAd = "Barbie Bebek",
                        Aciklama = "Barbie elbiseli bebek",
                        Kategori = "Kız Oyuncakları",
                        Fiyat = 60
                    },

                    new Urun
                    {
                        UrunAd = "Mutfak Seti",
                        Aciklama = "Mutfak eşyaları içeren set",
                        Kategori = "Kız Oyuncakları",
                        Fiyat = 120
                    },

                    new Urun
                    {
                        UrunAd = "Barbie Evi",
                        Aciklama = "Portatif barbie evi",
                        Kategori = "Kız Oyuncakları",
                        Fiyat = 250
                    },

                    new Urun
                    {
                        UrunAd = "Oyuncak Mermili Tabanca",
                        Aciklama = "Plastik mermi atan tabanca",
                        Kategori = "Erkek Oyuncakları",
                        Fiyat = 30
                    },

                    new Urun
                    {
                        UrunAd = "Futbol Topu",
                        Aciklama = "Mikasa Futbol Topu",
                        Kategori = "Erkek Oyuncakları",
                        Fiyat = 100
                    },

                     new Urun
                     {
                         UrunAd = "PubG Oyun Seti",
                         Aciklama = "PubG Saldırı Seti",
                         Kategori = "Erkek Oyuncakları",
                         Fiyat = 200
                     },

                      new Urun
                      {
                          UrunAd = "Akülü Jip",
                          Aciklama = "Akülü volvo jip",
                          Kategori = "Genel Oyuncaklar",
                          Fiyat = 2500
                      }

                    );
                context.SaveChanges();
            }
        }
    }
}

Statik olarak tanımladığım VeriDoldur metodu IApplicationBuilder argümanını alıyor. HTTP isteklerini işlemek için startup classı içinde yer alan configure interface’i kullanılıyor. IApplication Builder aynı zamanda Entity Framework Core veritabanı bağlam serviside dahil olmak üzere uygulamaların tüm hizmetlerine erişim imkanı da sağlar.

VeriDoldur metodum IApplicationBuilder interface’i aracılığı ile MiniDukkanContext nesnesi alır ve bu şekilde veritabanını çağırır. Son yazmış olduğum bu kodda eğer herhangi bir bekleyen migration var ise Migrate metodu ile veritabanını hazır diyorum. Böylelikle veritabanındaki ürünlerin sayısı kontrol ediliyor hiçbir ürün yok ise burada kullanmış olduğum AddRange metodu ile ürün nesneleri koleksiyonumu dolduruyor ve veritabanıma SaveChanges metodu ile yazdırıyorum.

Şimdi Startup.cs’ye gidelim ve VeriDoldur metodumuzu buraya ekleyelim.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using MiniDukkan.Models;

namespace MiniDukkan
{
    public class Startup
    {
        public Startup(IConfiguration config)
        {
            Configuration = config;
        }

        public IConfiguration Configuration { get; set; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.AddDbContext< MiniDukkanContext >(opts => opts.UseSqlServer(Configuration["ConnectionStrings:MiniDukkanConnection"]));

            services.AddScoped< IDukkanRepository, EFDukkanRepository >();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
            app.UseStaticFiles();

            app.UseRouting();

            app.UseStatusCodePages();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });

            HamVeri.VeriDoldur(app);
        }
    }
}

Bir sonraki yazıda ve videoda görüşmek üzere.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir