Entity Framework – Code First Migrations İşlemleri

Merhaba,

Her projede olduğu gibi Code First yaklaşımıyla inşa ettiğimiz projemizde de güncellenmesi gerekecek noktalar kaçınılmaz olacaktır. Gerek kodlarda, gerekse de programın akışını sağlayan algoritmada düzenlenme olacaksa da bu yazımızı asıl ilgilendiren veritabanının güncellenmesi gereken durumlardır. Biliyoruz ki, Code First deseni uygulanan bir projede veritabanına direkt olarak müdahale etmek oldukça sakıncalıdır. Haliyle yapacağımız ekleme, çıkarma veyahut güncelleme durumlarını tabloları temsil eden classlar üzerinde gerçekleştirmeli ve Generate etmeliyiz.

Tabi şuana kadar yaptığımız tüm işlemleri SQL Server’dan fiziksel veritabanını silip, yeniden yükleyerek gözlemlemiş bulunmaktayız. İşte, Migration yapıları sayesinde yaptığımız yenilikleri Visual Studio üzerinden hızlıca fiziksel veritabanına yansıtabileceğiz. Anlayacağınız, kod kısmında yaptığımız değişiklikleri veritabanına yansıtmaya Migration demekteyiz.

Migrations yapısını kullanabilmek için bize “Package Manager Console” penceresi gerekmektedir. Eğer ilgili pencere sizde açık değilse “Tools” -> “NuGet Package Manager” -> “Package Manager Console” kombinasyonunu takip ederek açabilirsiniz.

Entity Framework - Code First Migrations İşlemleri

Entity Framework – Code First Migrations İşlemleri

Migrations yapısını aktifleştirmek için “Package Manager Console” üzerinden “enable-migrations” komutunu kullanmalıyız.
Şimdi üzerinde çalıştığımız bir projede Migrations yapısını aktifleştirelim.

Entity Framework - Code First Migrations İşlemleri

Entity Framework – Code First Migrations İşlemleri

Bu işlemi yaptıktan sonra projemizde aşağıdaki gibi “Migrations” isimli bir klasör oluşmaktadır.

Entity Framework - Code First Migrations İşlemleri

Entity Framework – Code First Migrations İşlemleri

İlgili klasör içerisinde Migrations ayarlarını gerçekleştireceğimiz “Configuration.cs” isimli dosyamız mevcuttur. Dosyamıza şöyle bir göz atarsak eğer;

namespace EF.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<EF.Model.Context.OkulDBContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(EF.Model.Context.OkulDBContext 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. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
}

“Configuration.cs” sınıfını şöyle bir incelersek eğer “DbMigrationsConfiguration” sınıfından kalıtım alarak Context sınıfımıza işaretlenmiştir. Bunun yanında constructurında “AutomaticMigrationsEnabled” özelliğine “false” değeri atanmıştır. Bu(AutomaticMigrationsEnabled) özelliği sayesinde otomatik olarak veritabanını güncelletebiliyoruz. Haliyle “false” değerde olunca bu özellik kapalı olmaktadır. O yüzden “true” değerini set ediyoruz.

    internal sealed class Configuration : DbMigrationsConfiguration<EF.Model.Context.OkulDBContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
        }
.
.
.
    }

Bu işlemlerden sonra gelin veritabanını güncelleyelim.

Entity Framework - Code First Migrations İşlemleri Entity Framework - Code First Migrations İşlemleri
Güncellemeden önce Güncellerken(update-database) Güncellemeden sonra

Gördüğünüz gibi veritabanı “update-database” komutu sayesinde anında güncelleyebildik. Tabi ilk güncelleştirmede veritabanıda yoksa oluşturulmaktadır.

Yeni tablo eklediğinizde ya da var olan bir tabloya ekleme, çıkarma veyahut güncelleme yaptığınızda “update-database” komutunu çalıştırmanız yeterlidir.

AutomaticMigrationDataLossAllowed Özelliği

“AutomaticMigrationDataLossAllowed” özelliğinden bahsetmezsek olmaz. Yapacağınız tablo güncelleme durumlarında, tablonun dolu olma olasılığında varsayılan olarak veriler güvence altına alınmaktadır. Bizde bu(AutomaticMigrationDataLossAllowed) özellik sayesinde bu durumu aşabilmekte ve verilerin güvenirliğini göz ardı edebilmekteyiz. Doğal olarak ilgili özellik “false” default değerine sahiptir. Biz constructurda ilgili özelliği çağırarak “true” değerini set edebiliriz.

    internal sealed class Configuration : DbMigrationsConfiguration<EF.Model.Context.OkulDBContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = true;
        }
.
.
.   }

Migrasyon Ekleme

Model değişiklikleri için migrasyon eklemek için “Add-Migration” komutunu kullanarak “Add-Migration [Migrasyon Adi]” prototipini uygulayabilirsiniz.

Entity Framework - Code First Migrations İşlemleri

Entity Framework – Code First Migrations İşlemleri

Entity Framework - Code First Migrations İşlemleri

Gördüğünüz gibi migrasyonuda bu şekilde eklemekteyiz.

Bir yazımızın daha sonuna gelmiş bulunmaktayız.

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar dilerim…

Bunlar da hoşunuza gidebilir...

16 Cevaplar

  1. ahmet dedi ki:

    Merhaba bir problemim var mesela içinde veri olan modeldeki bir kolon adını güncellediğimde kolondaki veriler siliniyor bunun çözümü varmıdır.

    • Gençay dedi ki:

      Merhaba,

      Konuyla alakalı bir bilgim olursa size haber vereceğim. Eğer çözüm bulursanız lütfen bildiriniz.

    • Bora dedi ki:

      Verilerine zarar gelmeden kolon ismi değiştirmek istiyorsan Modelin içindeki değiştirmek istediğin sütuna bu şekilde yazarak [Column(“YeniAdAlanı”)] public string Ad { get; set; } yeni kolon ismi belirtmiş olursun sonra nuget packet manager consoldan Update-Database yazarak değiştini görebilirsin

  2. OĞUZHAN SARI dedi ki:

    Merhaba,
    Ben daha bu code first entitiy olayına ilk defa giriyorum.
    Bu yazı ve başka yerdeki bir yazı ve de youtube da bir kaç video (yabancı) izleyerek yapı oluşturdum.

    Şimdi aşağıdaki şekilde Products tablosu oluşturdum. İlk update-database işleminde.

    public DbSet Products { get; set; }

    Bunun class ıda şöyle

    namespace BiEntities.Models
    {
    public class Product
    {
    public int ID { get; set; }
    public decimal Price { get; set; } = 0;
    public virtual List Contents { get; set; } = new List();
    }
    }

    vede Contents class ı

    namespace BiEntities.Models
    {
    public class ProductContent
    {
    public int ID { get; set; }
    public string Name { get; set; }
    public string Detail { get; set; }
    public string Keywords { get; set; }
    public string SiteTitle { get; set; }
    public string Description { get; set; }
    }
    }

    Şimdi hiç bir sorun yok tablolar başarıyla eklendi.

    Benim sorum şu;
    Bir sütun ekledim,
    Bir sütun çıkardım,
    Bir tablo ekledim,
    Bir tablo çıkardım

    gibi olayları nasıl gerçekleştiriyoruz.

  3. serkan mendi dedi ki:

    Selamlar,
    Diyelim ki bir projem var, aynı projeyi aynı anda 10 farklı firma kullanıyor.Proje Winform olduğu için Her birinin Sql serverı ve Dbsi ayrı.Ve neredeyse hergün bir kolon yada tablo ekleniyor.Size bu işlemleri Veri kaybetmeden nasıl yapabilirim sizce..
    Bunun bir yolu varmı?

    • serkan mendi dedi ki:

      Demek istediğim her bir firmanın dbsini elimdeki Exe ile uyumlu hala getirebilmek için veri kaybetmeden nasıl güncellerim

  4. CSharper dedi ki:

    Tablo isimlerindeki S-ES takilarindan kurtulmak icin tablo isminin basina TableAttribute kullanabilirsin. Örnek [Table(“Company”)] seklinde. Yada Configuration sinifinda OnModelCreating metodunu override ederek içerisine Context.Conventions.Remove(); komutunu yazabilirsin.

  5. Ali Haydar dedi ki:

    Merhaba,

    classda yaptığımız değişikliği database uygulamak için add-migration ve update-database yapıyoruz kodda çalıştığı için problem yok yaptığım değişikler database uygulanıyor.

    fakat exeyi başka bi pcde çalıştırmak istediğimde o pcde ki database güncelleme yapmıyor hata veriyor. bu sorunu aşmanın yolu nasıl oluyor.

    • Gençay dedi ki:

      Merhaba,

      İlgili database’in o başka pc(ler)de de bulunması gerekmekte ve ayriyetten her bir pcnin server provider adresi o pcye özel olarak değiştiği göz önüne alınarak ilgili programın server bilgileri o pcye özel gerektiği gibi güncellenmelidir.

Bir Cevap Yazın

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

*

Copy Protected by Chetan's WP-Copyprotect.