"Enter"a basıp içeriğe geçin

Code First Migration Kullanımı

Migration’ı Neden Kullanırız?

Code first yaklaşımı ile inşa edilen bir projede, veritabanı yapısında yapılan değişikliklerde veritabanı yeniden oluşturulur, haliyle içersindeki verilerde silinir. (Örneğin veritabanındaki bir tabloya bir sütun eklendiğinde) Bunun önüne geçmek için migration yapısını kullanacağız. Migration, veritabanımız yoksa veritabanını oluşturur. Eğer veritabanımız varsa ve veritabanı yapısında değişiklik yapılmışsa, veritabanını yeniden oluşturmaz sadece veritabanını günceller. Konuyu daha iyi anlamak için hemen uygulamaya geçelim.

Migration kullanımını; youtube’a yüklemiş olduğum videoyu izleyerek yada konuyu inceleyerek öğrenebilirsiniz.

Migration Kullanımı

Migrations yapısını aktifleştirmek için “Package Manager Console” ekranına geliyoruz. İlk olarak hangi katmana oluşturacaksan onu belirtiyoruz. Ardından “enable-migrations” komutunu giriyoruz.
Bu işlemden sonra projemizde “Migrations” adlı klasör oluşuyor ve bunun içerisinde aşağıdaki kodları içeren  “Configuration.cs” isimli dosyamız bulunmaktadır.
namespace Data.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(Data.Context context)
        {
            // This method will be called after migrating to the latest version.

            // You can use the DbSet.AddOrUpdate() helper extension method
            // to avoid creating duplicate seed data.
        }
    }
}

Yapıcı methodudaki “AutomaticMigrationsEnabled”  özelliğini true yapıyoruz. Böylece veritabanımızın otomatik olarak güncellenmesini sağlıyoruz. Yapıcı methodumuza, “AutomaticMigrationDataLossAllowed = true;” kodunu da ekleyerek, tabloda veri olmasına rağmen tablo üzerinde yapısal değişiklik yapılmasına izin veriyoruz.

using System.Data.Entity.Migrations;

namespace Data.Migrations
{
    internal sealed class Configuration : DbMigrationsConfiguration
    {
        public Configuration()
        {
            //Otomatik güncelleme işlemine izin verir.
            AutomaticMigrationsEnabled = true;
            //Tabloda veri olmasına rağmen tablo üzerinde yapısal değişiklik gerçekleştirmemize izin verir.
            AutomaticMigrationDataLossAllowed = true;
        }

        protected override void Seed(Context context)
        {
            // This method will be called after migrating to the latest version.

            // You can use the DbSet.AddOrUpdate() helper extension method
            // to avoid creating duplicate seed data.
        }
    }
}
Ardından context sınıfımızı düzenliyoruz.(Kullanıcı sınıfını önceden oluşturmuştum.)
using Deneme.Migrations;
using Deneme.model;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace Deneme
{
    public class Context : DbContext
    {
        public Context() : base("Context")
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion("Context"));
        }

        public virtual DbSet Kullanicilar { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove();
            base.OnModelCreating(modelBuilder);
        }
    }
}

Şimdi Package Manager Console ‘a aşağıdaki kodu ekleyip enter’a basalım ve veritabanımızı oluşturalım.

update-database
Buraya kadar herşey tamam. Fakat tablo ismini güncellemek istediğimizde yada tablo içersindeki sütun isimlerini güncellemek istediğimizde bunun için de ufak bir işlem yapmamız gerekiyor.
Örnek olarak bir “Kullanıcı” adlı sınıfımız olsun.Bunun içersinde “Sutun” adlı özelliğimiz olsun.
using System.ComponentModel.DataAnnotations.Schema;

namespace Deneme.model
{
    public class Kullanici
    {
        public int Id { get; set; }

        public string Sutun { get; set; }
    }
}

Biz burada Kullanici adlı sınıfımızın isminide Kullanicilar yapmak istiyoruz. Bunun için ilk olarak değiştirecek olduğumuz sınıf ismimizin üstüne yeni isimi girelim.

using System.ComponentModel.DataAnnotations.Schema;

namespace Deneme.model
{
    [Table("Kullanicilar")]
    public class Kullanici
    {
        public int Id { get; set; }

        public string Sutun { get; set; }
    }
}

Package Manager Console ‘a  “Add-Migration AddKullanici” şeklinde yazıp enter ‘a basalım. (AddKullanici dememin sebebi kullanici sınıfında, değişenleri algılayıp otomatik kod oluşturması için.)

namespace Deneme.Migrations
{
    using System.Data.Entity.Migrations;

    public partial class AddKullanici : DbMigration
    {
        public override void Up()
        {
            RenameTable(name: "dbo.Kullanici", newName: "Kullanicilar");
        }

        public override void Down()
        {
            RenameTable(name: "dbo.Kullanicilar", newName: "Kullanici");
        }
    }
}

İsmini verdiğimiz AddKullanici adlı class ‘ı oluşturdu. Burada methodlar içersinde değişmesini istediğimiz tablo ismini otomatik olarak algıladı ve oluşturdu. Şuanda işlemler kodlandı fakat veritabanına işlenmedi. Bunun için aşağıdaki kodu yazarak veritabanını güncelliyoruz.

update-database

Böylece tablomuzun ismi güncellendi. Güncellendikten sonra sınıfımızın içersine giriyoruz ve eski ismini, yeni ismiyle değiştiriyoruz.

using System.ComponentModel.DataAnnotations.Schema;

namespace Deneme.model
{
    public class Kullanicilar
    {
        public int Id { get; set; }

        public string Sutun { get; set; }
    }
}

Sınıf içersindeki özellikleri değiştirmek için de aynı işlemleri yapmamız yeterli. Sutun değişkenimizin üstüne yeni sutun ismini yazıyoruz.

using System.ComponentModel.DataAnnotations.Schema;

namespace Deneme.model
{
    public class Kullanici
    {
        public int Id { get; set; }

        [Column("YeniSutun")]
        public string Sutun { get; set; }
    }
}

Ardından AddKullanici sınıfına gelip şu kodları yazıyoruz. (Elle yazmak istemezseniz AddKullanici sınıfını silip tekrar aynı isimle oluşturduğunuzda değişikleri algılayıp otomatik kodları oluşturabilir.)

namespace Deneme.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class AddKullanici : DbMigration
    {
        public override void Up()
        {
            RenameColumn(table: "dbo.Kullanici", name: "Sutun", newName: "YeniSutun");
        }

        public override void Down()
        {
            RenameColumn(table: "dbo.Kullanici", name: "YeniSutun", newName: "Sutun");
        }
    }
}
İşlemleri veritabanına işlenmesi için aynı şekilde “update-database” kodunu giriyoruz.
Umarım sade ve anlaşılır olmuştur.
İyi Kodlamalar!
Yazıyı Paylaşmak İster misin?
Share on Facebook
Facebook
Pin on Pinterest
Pinterest
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Share on Tumblr
Tumblr
Share on Reddit
Reddit
    Bir cevap yazın

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