MIGRATION EKLEME NASIL YAPILIR?

Bir önceki derste kategori modelimizi oluşturduk, DBContext classımıza ekleme yaptık. Migration nedir bahsettik. Şimdi gelelim Migration ekleme işlemine. Öncleikle Migration ekleyebilmek için benim ilgili EF Core paketini projeme dahil etmem gerekli. Bunun için Visual Studio’da Tools menüsü altında yer alan, Nuget Package Manager > Manage Nuget Packages for Solution alanına geliyorum. Burada arama yaparak; Microsoft.EntityFrameworkCore.Tools paketini yüklüyorum, birnceki yüklediğim paketler ile aynı sürüme sahip olmasına dikkat edelim. Daha sonra bunu projemde ana solutiona ve Data Access katmanıma yükleyeceğim için bunları seçiyor ve Install diyorum.

Detaylı ders anlatımı ve kod takibi için video:

Daha sonra Visual Studio’da Tools menüsü altında yer alan, Nuget Package Manager > Package Manager Console çalıştırıyorum. Migration ekleme, database update gibi işlemleri bu package manager console ekranı vasıtası ile yapacağım.

Migration Oluşturma

Burada yeni bir migration eklemek için add-migration ve migration adını yazmam gerekli. Migration adı mümkün olduğunca yapacağınız işi özetleyen bir isim olmalı. Böylelikle hani migration ne iş yapar migration isminden çıkarabilirsiniz. Burada ben migration adını EkleKategoriTablosuDB yapıyorum. Ekleme işlemim var neyi nereye ekliyorum diye belirtiyorum yani.

Şimdi burada dikkat etmemiz gereken bir nokta var, Package Manager Console alanında Default Project olarak DataAccess katmanımızın seçili olması gerek. Eğer burası seçili olmadan ben aşağıdaki kodu yazarsam hata alırım. Buna dikkat ediyorum.

Şimdi bunu yapmadan komutumuzu yazalım.

Add-migration EkleKategoriTablosuDb

İlk hatam doğru default project seçmediğim için. Düzeltiyorum.

Bir hata daha aldım, bu da startup projesinin doğru olarak seçilmemesinden kaynaklanıyor. Biz bir solution altında birden fazla proje seçtiğimiz için bunun hangisinin startup projesi olduğunu belirtmemiz lazım. Dolayısı ile web projem alanında sağ tıklıyor ve Set as Startup Project diyerek burasının başlangıç projesi olduğunu belirtiyorum.

Akabinde package manager consoleda komutumu yazıyorum ve migration oluşturulmasını sağlıyorum.

Add-migration EkleKategoriTablosuDb

Migration oluşturulduktan sonra projemde DataAccess katmanımız altında yeni bir klasör oluşturuluyor. Migrations olarak oluşturulan bu klasörün altına geldiğimizde az önce eklediğim migration ismini görebilirim. Ön kısmında migration oluşturma tarihi ve saat bilgisi eklenmiş durumda. Biz buna zaman mührü, time stamp diyoruz. Otomatik olarak ekleniyor. Akabinde benim verdiğim ismi görebiliriz.

Bu klasörün altında bir de ApplicationDbContextModelSnapshot.cs var. Bu bizim veritabanımıza hangi migrationsları uyguladığımızı gösteren bir class. Ayrıca veritabanımızın güncel durumunu da yansıtmakta. Yani değişiklik izleme aracı diyelim.

Migration Dosyası İnceleme

Şimdi gelelim oluşturlan migration dosyamızı incelemeye.

using Microsoft.EntityFrameworkCore.Migrations;

namespace GRSYKitapEvi_DataAccess.Migrations
{
    public partial class EkleKategoriTablosuDB : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "Kategoriler",
                columns: table => new
                {
                    KategoriId = table.Column< int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    KategoriAd = table.Column< string>(type: "nvarchar(max)", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Kategoriler", x => x.KategoriId);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Kategoriler");
        }
    }
}

Bu dosyamda migrationBuilder classı ile CreateTable diyerek tablo oluşturma işlemim başlamış. Tablonun adı, tablodaki alanlarım yani kolonlar (propertylere karşılık gelirler) tanımlanmış durumda. Benim ilk alanım KategoriID burada ilk alanım görüldüğü üzere Identity olarak tanımlanmış durumda, başlangıç değeri de 1 ve artım miktarı da 1 olarak otomatik olarak verilmiş, süper bi şey yapmama gerek yok 😊 Bir önceki derste göreceğiz demiştik.

Sonra kategori adı alanımı oluşturmuş, sring tipinde dediğim için bunu nvarchar olarak oluşturmuş durumda.

EF Core kuralı olarak her bir tablom mutlaka primary key alanına sahip olması gerektiği için KategoriID olarak belirttiğimiz alanı otomatik olarak primary key olarak tanımladı. Ancak dikkat edilmesi gereken bir nokta eğer ben burada KategoriID ismi yerine başka bir isim verirsem tablomda primary key olarak tanımlanan alan olmadığı için hata alırım buna dikkat edelim.  Yani Kategori_ID olmaz mesela, bunları da örnekleriz, bu migration oluşturma, müdahale etme konuları iyi anlaşılsın istiyorum. Ama onlara bu derste değinmeyelim, karışmasın konularımız.

Şimdi bizim migration uygun şekilde oluşturulmuş durumda, bunu database tarafına yansıtmamız gerek bunun için ben database için güncelle demem gerekli. Dolayısı ile package manager console alanına geliyor ve aşağıdaki kodu yazıyorum.

Update-database

Bunu yazdıktan sonra tamamlandı mesajları ile işim bitiyor, uygulama tarafında değişiklikleri göremiyorum. Dolayısı ile sql servera gidip bakıyorum. Database daha önce hiç olmadığı için database de bu ilk migration ile oluşturulmuş durumda.

Database’e baktığımda altında iki tane tablom var, birisi şimdi oluşturduğum Kategori tablom. Diğeri ise EFMigrationsHistory tablosu. Bu tablo oluşturulan migrationlar için bir Id değeri atar ve bu id değerini verdiğimiz isim ve önündeki timestamp ile takip eder. Yanda da EF Core versiyon numarası yazmakta..

Böylelikle işlemim bitiyor daha önce dediğim gibi buderste migration oluşturma ve ekleme işlemini ve database tarafına yansıtma işlemini yaptık, ilerleyen derslerde migration düzenleme işlemleri yaparız.

Bir sonraki derste görüşmek üzere..

Bir cevap yazın

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