Otomatik Kod İlk Geçişleri
Otomatik Geçişler, yaptığınız her değişiklik için projenizde bir kod dosyası olmadan İlk Kod Geçişlerini kullanmanıza olanak tanır. Tüm değişiklikler otomatik olarak uygulanamayabilir; örneğin sütun yeniden adlandırmaları için kod tabanlı geçiş kullanılması gerekir.
Not
Bu makalede, temel senaryolarda Code First Migrations'ın nasıl kullanılacağını bildiğiniz varsayılır. Aksi takdirde devam etmeden önce Code First Migrations'ı okumanız gerekir.
Ekip Ortamları için Öneri
Otomatik ve kod tabanlı geçişler arasında geçiş yapabilirsiniz, ancak ekip geliştirme senaryolarında bu önerilmez. Kaynak denetimini kullanan bir geliştirici ekibinin parçasıysanız, tamamen otomatik geçişler veya tamamen kod tabanlı geçişler kullanmanız gerekir. Otomatik geçişlerin sınırlamaları göz önünde bulundurulduğunda, takım ortamlarında kod tabanlı geçişleri kullanmanızı öneririz.
İlk Model ve Veritabanı Oluşturma
Code First Migrations aracını kullanmaya başlamadan önce üzerinde çalışacağımız bir projeye ve Code First modeline ihtiyacımız olacak. Bu kılavuzda kurallı Blog ve Post modelini kullanacağız.
- Yeni bir MigrationsAutomaticDemo Konsol uygulaması oluşturma
- EntityFramework NuGet paketinin en son sürümünü projeye ekleme
- Araçlar -> Kitaplık Paket Yöneticisi -> Paket Yöneticisi Konsolu
- Install-Package EntityFramework komutunu çalıştırın
- Aşağıda gösterilen kodu içeren bir Model.cs dosyası ekleyin. Bu kod, alan modelimizi oluşturan tek bir Blog sınıfını ve EF Code First bağlamımız olan blogContext sınıfını tanımlar
using System.Data.Entity;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity.Infrastructure;
namespace MigrationsAutomaticDemo
{
public class BlogContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
}
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
}
}
- Artık bir modele sahip olduğumuza göre bunu kullanarak veri erişimini gerçekleştirebiliriz. Program.cs dosyasını aşağıda gösterilen kodla güncelleştirin.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MigrationsAutomaticDemo
{
class Program
{
static void Main(string[] args)
{
using (var db = new BlogContext())
{
db.Blogs.Add(new Blog { Name = "Another Blog " });
db.SaveChanges();
foreach (var blog in db.Blogs)
{
Console.WriteLine(blog.Name);
}
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
Uygulamanızı çalıştırdığınızda migrationsAutomaticCodeDemo.BlogContext veritabanının sizin için oluşturulduğunu göreceksiniz.
Code First Migrations aracını etkinleştirme
Modelimizde daha fazla değişiklik yapma zamanı geldi.
- Şimdi Blog sınıfına bir Url özelliği ekleyelim.
public string Url { get; set; }
Uygulamayı yeniden çalıştırırsanız, veritabanı oluşturulduktan sonra 'BlogContext' bağlamını arkalayan modelin değiştiğini belirten bir InvalidOperationException alırsınız. Veritabanını ( http://go.microsoft.com/fwlink/?LinkId=238269) güncelleştirmek için Code First Migrations kullanmayı göz önünde bulundurun.
Özel durumdan da anlaşılacağı gibi Code First Migrations aracını kullanmaya başlamanın zamanı geldi. Otomatik geçişleri kullanmak istediğimiz için –EnableAutomaticMigrations anahtarını belirteceğiz.
Paket Yöneticisi Konsolunda Enable-Migrations –EnableAutomaticMigrations komutunu çalıştırın. Bu komut projemize bir Migrations klasörü eklemiştir. Bu yeni klasör tek bir dosya içerir:
Configuration sınıfı. Bu sınıf, Code First Migrations aracının bağlamınızda nasıl davranacağını yapılandırmanıza olanak tanır. Bu kılavuzda varsayılan yapılandırmayı kullanacağız. Projenizde yalnızca tek bir Code First bağlamı olduğundan Enable-Migrations bu yapılandırmanın geçerli olduğu bağlam türünü otomatik olarak doldurdu.
İlk Otomatik Geçişiniz
Code First Migrations aracında sürekli kullanacağınız iki temel komut vardır.
- Add-Migration komutu, son geçiş oluşturulduktan sonra modelinizde yaptığınız değişikliklere göre sonraki geçişin iskelesini oluşturur
- Update-Database komutu, bekleyen geçişleri veritabanına uygular
Add-Migration'ı kullanmaktan kaçınacağız (gerçekten gerekmedikçe) ve Code First Migrations'ın değişiklikleri otomatik olarak hesaplamasına ve uygulamasına izin vermemeye odaklanacağız. Değişiklikleri modelimize (yeni Blog.Url özelliği) veritabanına göndermek üzere Code First Migrations'ı almak için Update-Database'i kullanalım.
- Paket Yöneticisi Konsolu'nda Update-Database komutunu çalıştırın.
MigrationsAutomaticDemo.BlogContext veritabanı artık Bloglar tablosuna Url sütununu içerecek şekilde güncelleştirildi.
İkinci Otomatik Geçişiniz
Başka bir değişiklik daha yapalım ve Code First Migrations'ın değişiklikleri otomatik olarak veritabanına göndermesine izin verelim.
- Yeni bir Post sınıfı da ekleyelim
public class Post
{
public int PostId { get; set; }
[MaxLength(200)]
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
- Ayrıca Blog ile Post arasında ilişkinin diğer tarafını oluşturmak için Blog sınıfına bir Posts koleksiyonu ekleyeceğiz
public virtual List<Post> Posts { get; set; }
Şimdi veritabanını güncel olarak getirmek için Update-Database'i kullanın. Bu kez Code First Migrations aracı tarafından çalıştırılan SQL kodunu görmek için –Verbose bayrağını belirtelim.
- Paket Yöneticisi Konsolu’nda Update-Database –Verbose komutunu çalıştırın.
Kod Tabanlı Geçiş Ekleme
Şimdi kod tabanlı geçiş kullanmak isteyebileceğimiz bir şeye bakalım.
- Şimdi Blog sınıfına bir Derecelendirme özelliği ekleyelim
public int Rating { get; set; }
Bu değişiklikleri veritabanına göndermek için Update-Database'i çalıştırabiliriz. Ancak, boş değer atanamayan bir Blogs.Rating sütunu ekliyoruz. Tabloda mevcut veriler varsa yeni sütun için veri türünün CLR varsayılanı atanır (Derecelendirme tamsayıdır, dolayısıyla 0 olur). Ancak Blogs tablosundaki mevcut satırların düzgün bir derecelendirmeyle başlaması için varsayılan 3 değerini belirtmek istiyoruz. Düzenleyebilmemiz için bu değişikliği kod tabanlı geçişe yazmak için Geçiş Ekle komutunu kullanalım. Add-Migration komutu bu geçişlere bir ad vermemizi sağlar. Şimdi bizimkine AddBlogRating adını verelim.
- Paket Yöneticisi Konsolu'nda Add-Migration AddBlogRating komutunu çalıştırın.
- Migrations klasöründe artık yeni bir AddBlogRating geçişimiz var. Geçiş dosya adı, sıralamaya yardımcı olmak için bir zaman damgasıyla önceden düzeltildi. Blog.Rating için varsayılan 3 değerini belirtmek üzere oluşturulan kodu düzenleyelim (Aşağıdaki kodda 10. satır)
Geçişte bazı meta verileri yakalayan arka planda kod dosyası da bulunur. Bu meta veriler Code First Migrations'ın bu kod tabanlı geçiş öncesinde gerçekleştirdiğimiz otomatik geçişleri çoğaltmasına olanak tanır. Başka bir geliştirici geçişlerimizi çalıştırmak isterse veya uygulamamızı dağıtma zamanı geldiğinde bu önemlidir.
namespace MigrationsAutomaticDemo.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddBlogRating : DbMigration
{
public override void Up()
{
AddColumn("Blogs", "Rating", c => c.Int(nullable: false, defaultValue: 3));
}
public override void Down()
{
DropColumn("Blogs", "Rating");
}
}
}
Düzenlediğimiz geçiş iyi görünüyor. Veritabanını güncelleştirmek için Update-Database komutunu kullanalım.
- Paket Yöneticisi Konsolu'nda Update-Database komutunu çalıştırın.
Otomatik Geçişlere Geri Dön
Artık daha basit değişikliklerimiz için otomatik geçişlere geri dönebiliriz. Code First Migrations, otomatik ve kod tabanlı geçişleri her kod tabanlı geçiş için arka planda kod dosyasında depoladığı meta verileri temel alarak doğru sırada gerçekleştirmeyi üstlenir.
- Şimdi modelimize post.abstract özelliği ekleyelim
public string Abstract { get; set; }
Artık Update-Database'i kullanarak Otomatik Geçiş kullanarak bu değişikliği veritabanına göndermek üzere Code First Migrations'ı alacağız.
- Paket Yöneticisi Konsolu'nda Update-Database komutunu çalıştırın.
Özet
Bu kılavuzda, model değişikliklerini veritabanına göndermek için otomatik geçişlerin nasıl kullanılacağını gördünüz. Ayrıca daha fazla denetime ihtiyaç duyduğunuzda otomatik geçişler arasında kod tabanlı geçişlerin nasıl yapı iskelesi yapılacağını ve çalıştırıldığını gördünüz.