Code First Migration Kullanımı

İbrahim     29 Kasım 2018     291     2    
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.
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.

Code First Migration Kullanımı

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<Data.Context>
    {
        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<T>.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<Context>
    {
        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<T>.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, Configuration>("Context"));
        }

        public virtual DbSet<Kullanici> Kullanicilar { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            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 -verbose

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 -verbose

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 -verbose" kodunu giriyoruz.

Umarım sade ve anlaşılır olmuştur.

İyi Kodlamalar!


Etiketler:  
code-first-migration
code-first
migration-kullanimi
migration-nedir
migration-ne-ise-yarar


Paylaş:  

Bir Cevap Yazın

A

Abdullah 26 Ocak 2019
Elinize sağlık İbrahim Bey.

İbrahim Çakal 27 Ocak 2019
Teşekkürler Abdullah Bey.