Selamlar bu yazımda migrations işlemlerini anlatacağım fakat geçmeden önce geçen yazımdaki ufak bir yanlışı düzeltmek istedim, eğer yazının tamamını okuduysanız hatırlarsınız ki dbContext’i builder.Services içerisine iki farklı şekilde eklemiştik sanki sadece services.AddDbContext<MyDbContext>() dedikten sonra constructor içerisinde türetemiyormuşuz gibi bir şey dememişim fakat sonraki açıklamalarım bu şekilde anlaşılmaya yol açabileceği için onu düzeltmek istedim. db context objesi services’e eklendikten sonra constructor’lar içerisinde çağırılabilir.
Her neyse şimdi gelelim migrations işlemlerine fakat ondan önce migrations nedir onu bi açmak isterim.
Normalde eğer dbFirst işlemi yapıyorsanız yani veri tabanınızı önceden hazırlayıp sonra dbContext ile işlemler yapacaksanız migrations’lara ihtiyacınız yok fakat siz veri tabanında tablolarınızı elle oluşturmak istemiyorsanız sadece c# classlarını yaparak bunu yapabilirsiniz.
Migrations aslında bunların takibini yapmak için var örneğin bizim eklemiş olduğumuz DbSet objesine bir bakalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using Microsoft.EntityFrameworkCore; using MyEfCoreText.Entities; namespace MyEfCoreText.Persistence; public class MyDbContext : DbContext { public DbSet<Blog> Blogs { get; set; } public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { } } |
işaretlediğim satıra dikkatli bakarsanız DbContext içerisinde bir Blog dbSet’i oluşturulmuş bu aslında şu demek benim veri tabanımda Blogs adlı bir tablom olacak ve bu tablomdaki kolonlar Blog sınıfı içerisindeki property’ler olacak hemen gidelim bakalım kolonlarımız ne olacakmış
1 2 3 4 5 6 7 8 |
namespace MyEfCoreText.Entities; public class Blog { public int Id { get; set; } public string Url { get; set; } = null!; public string? Title { get; set; } public string Content { get; set; } = string.Empty; } |
Gördüğünüz gibi blog sınıfı içerisinde 4 adet property mevcut ve bunun içerisinde Id Url Tİtle ve Content değerleri var bunlar tablomuzdaki kolonlarımız olacak.
Normalde Migration oluşturmak için Visual Studio içerisinde Package Manager Console kullanılır fakat ben onu kullanmayı tercih etmiyorum.
Dotnet cli aracını çıkardığından beri sürekli geliştiriyor ve tool’lar ekliyor bu tool’ların içerisine hemen ef ile işlem yapabileceğimiz tool’u ekleyelim
1 |
dotnet tool search dotnet-ef |
yukarıdaki kodu yapıştırdığınızda aşağıdaki gibi bir sonuç alacaksınız
gördüğünüz gibi bir adet dotnet-ef tool’umuz mevcut bunu kurmamız gerekiyor ben genelde bu tool’u tüm projelerimde kullanacağım için global olarak kuruyorum aşağıdaki komutu kullanarak dotnet ef tool’unu kuralım
1 |
dotnet tool install --global dotnet-ef |
Bu şekilde kurduktan sonra migration oluşturma adımımıza başlayabiliriz.
Projemizin bulunduğu konuma gidin ve aşağıdaki kodu orada çalıştırın.
1 |
dotnet ef migrations add Init |
bu kodu çalıştırdığınızda ismi Init olan bir migration oluşturmaya çalışacak fakat projeniz içerisinde Microsoft.EnityFrameworkCore.Design paketi bulunmadığı için oluşturamayacak burada aslında şunu demek istiyor. Benim veri tabanı kodlarını oluşturan paketim design paketi sen bunu yükle ki ben sana kolaylık veri tabanı kodlarını üretebileyim.
Hemen ok diyoruz ve aşağıdaki kodu çalıştırıyoruz
.
1 |
dotnet add package Microsoft.EntityFrameworkcore.Design |
Bu kodu çalıştırdıktan sonra paket projemize yüklenmiş olacak, hemen tekrar migration oluşturma kodunu çalıştıralım
1 |
Done. To undo this action, use 'ef migrations remove' |
terminalde en son bu şekilde bir çıktı görmemiz lazım burada başarılı bir şekilde oluşturulduğunu görebiliriz. yanında yazdığı mesaj ise son oluşturulan migration’ı silmek için çalıştıracağımız kod eğer silmek istersek tabi
İşlem başarılı bir şekilde tamamlandıktan sonra Migrations adında bir klasör oluşacak bu klasör içerisinde oluşturulan migrations’ları görebiliriz, isterseniz elle de müdahale edebilirsiniz fakat ben kesinlikle önermiyorum.
Şimdi sıra kaldı veri tabanımızı oluşturmaya, veri tabanınızdaki verileri görüntülemek için herhangi bir db browser kullanabilirsiniz ben dbeaver kullanıyorum sizlere de tavsiye ederim.
Şimdi migration oluşturduk fakat veri tabanı sunucumuzda bir veri tabanı ve tablo oluşturmadık öncelikle oluşturma işlemini yapalım
1 |
dotnet ef database update |
Yine projeniz içerisinde yukarıdaki kodu çalıştırırsanız veri tabanınızı oluşturacaktır.
yukarıdaki fotoğrafta işaretlediğim alana dikkatli bakarsanız oluşturduğumuz migrations’ı uygulamakta olduğunu söylüyor yani bu şu demek siz bir veri tabanını güncellemeden önce sırayla 2,3 defa migration alırsanız bunları sırasıyla uygulayacak.
Bakalım veri tabanımıza…
Veri tabanımıza bağlandığımızda blogs tablomuzun oluştuğunu görüyoruz fakat en altta __EFMigrationsHistory adlı bir tablo daha var o da ne ki ?
içerisine girip data’ları incelediğimizde
MigrationId ve hangi versiyon olduğu mevcut yani uygulanan migration’lar var. Buradaki migration history’e bakarak database update dediğimizde sadece uygulanmaya migration’ları uygulayacak hemen deneyelim gidelim ve database update işlemi yapalım.
Ben şahsen bu uyarıyı aldım, yani uygulanabilecek bir migration olmadığını söyledi
Şimdi gelelim Blogs tablomuza…
Blogs tablomuzun içeriğine baktığımızda ise bizim Blog class’ımızda bulunan 4 adet property’nin mevcut olduğunu görebiliriz.
Yani işin özü şu.. Eğer siz blog class’ınıza yeni bir parametre eklerseniz örneğin şu şekilde değiştirelim.
1 2 3 4 5 6 7 8 9 |
namespace MyEfCoreText.Entities; public class Blog { public int Id { get; set; } public string Url { get; set; } = null!; public string? Title { get; set; } public string Content { get; set; } = string.Empty; public string Author { get; set; } = string.Empty; } |
Gördüğünüz gibi 8. satıra bir author değeri ekledim şimdi yapmam gereken bunu veri tabanına kaydetmek. Önce migration almamız lazım.
1 |
dotnet ef migrations add AddedAuthorToBlog |
Yukarıdaki kodu çalıştırdığımızda bir migration daha eklemiş oluyoruz migration oluşturduğumuza göre şimdi de gidip veri tabanımızı güncelleyelim.
1 |
dotnet ef database update |
kodunu çalıştırdığımızda ve veri tabanımıza tekrardan göz attığımızda
Author property’sinin eklendiğini görüyoruz yani veri tabanı güncelleme işlemimiz başarılı.
Bu yazımda projemiz c# dotnet projemiz içerisinde veri tabanımız için nasıl migration alabiliriz ve veritabanını code first ile oluşturabiliriz ona baktık. Sonraki yazımda görüşmek ise esen kalın.