C# İle Entity Framework Kullanarak Veritabanı Migration Nasıl Yapılır?

C# İle Entity Framework Kullanarak Veritabanı Migration Nasıl Yapılır?
C# İle Entity Framework Kullanarak Veritabanı Migration Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Entity Framework Core ile çalışmaya başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 yılı standartlarında .NET 9 veya üzeri bir sürüm kullanmanız önerilir. Gerekli araçları projenize dahil etmek için NuGet paket yöneticisini kullanacağız.

  • Visual Studio 2022 veya VS Code.
  • .NET SDK (En güncel sürüm).
  • Microsoft.EntityFrameworkCore.Tools paketi.
  • Microsoft.EntityFrameworkCore.SqlServer (veya tercih ettiğiniz veritabanı sağlayıcısı).

Projenizi oluşturduktan sonra terminal üzerinden şu komutla gerekli araçları yükleyebilirsiniz:

dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.SqlServer

Bu paketler, migration oluşturma ve veritabanına uygulama komutlarını projenize dahil eder.

Adım Adım Veri Modeli Oluşturma

Migration sürecinin ilk adımı, veritabanına yansıtılacak olan C# sınıflarını (Entity) tanımlamaktır. Örneğin, bir "Ürün" (Product) tablosu oluşturmak istediğimizi varsayalım.

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public decimal Price { get; set; }
    public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}

Yukarıdaki kod, veritabanında "Products" adında bir tablo oluşturulmasını sağlar. "Id" özelliği otomatik olarak Primary Key (Birincil Anahtar) olarak algılanacaktır.

DbContext Sınıfını Yapılandırma

DbContext, veritabanı ile uygulama arasındaki köprüdür. Veritabanı bağlantı dizgisi (connection string) ve tabloların (DbSet) tanımlandığı yer burasıdır.

public class AppDbContext : DbContext
{
    public DbSet Products { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=StoreDb;Trusted_Connection=True;");
    }
}

Bu sınıf, EF Core'un veritabanı ile nasıl konuşacağını belirler. Güvenlik Uyarısı: Gerçek projelerde bağlantı dizgilerini kod içinde değil, "appsettings.json" gibi güvenli konfigürasyon dosyalarında tutun.

İlk Migration Dosyasını Oluşturma

Modeliniz hazır olduğunda, bu değişiklikleri bir "migration" dosyasına dönüştürmeniz gerekir. Bu dosya, veritabanında yapılacak değişikliklerin bir kaydıdır.

dotnet ef migrations add InitialCreate

Bu komut, projenizde "Migrations" adında bir klasör oluşturur ve içinde iki dosya üretir: Biri veritabanı şemasını oluşturur (Up), diğeri ise hata durumunda geri almayı sağlar (Down).

Veritabanını Güncelleme

Migration dosyasını oluşturmak, veritabanını henüz değiştirmez. Değişiklikleri uygulamak için "update" komutunu çalıştırmalısınız. Bu komut, henüz uygulanmamış tüm migration dosyalarını sırayla veritabanında çalıştırır.

dotnet ef database update

Bu işlem sonucunda SQL Server üzerinde "StoreDb" adında bir veritabanı ve içinde "Products" tablosu oluşturulacaktır.

Migration Yöntemlerinin Karşılaştırılması

Yöntem Avantaj Dezavantaj
Code-First Migration Kod odaklı, hızlı geliştirme Karmaşık SQL senaryolarında kısıtlı
Database-First Mevcut veritabanı ile uyumlu Kodun veritabanına bağımlılığı yüksek
Kritik Uyarı: Production (Canlı) ortamda database update komutunu doğrudan çalıştırmayın. Bunun yerine dotnet ef migrations script komutuyla SQL script'i oluşturun ve veritabanı yöneticinizle paylaşın.

Sıkça Sorulan Sorular

Migration dosyasını nasıl geri alabilirim?

Eğer bir hata yaptıysanız ve veritabanını bir önceki sürüme döndürmek isterseniz dotnet ef database update [MigrationAdi] komutunu kullanabilirsiniz.

Veritabanı şeması ile kodum uyumsuz olursa ne olur?

EF Core, migration geçmişini __EFMigrationsHistory tablosunda tutar. Eğer kod ve veritabanı eşleşmezse, uygulama başlatılırken hata alırsınız.

Migration dosyalarını düzenleyebilir miyim?

Evet, ancak çok dikkatli olmalısınız. Özellikle veri kaybına yol açabilecek (sütun silme gibi) işlemlerde manuel müdahale gerekebilir.

Farklı veritabanı sağlayıcıları kullanılabilir mi?

Evet, EF Core sadece SQL Server değil; PostgreSQL, SQLite ve MySQL gibi birçok sağlayıcıyı destekler.

Migration'lar neden önemlidir?

Ekip çalışmasında veritabanı değişikliklerinin versiyonlanmasını ve herkesin aynı şemayı kullanmasını sağlar.

Migration Süreçlerinde Hata Ayıklama ve Sorun Giderme

Entity Framework Core ile çalışırken, özellikle karmaşık projelerde migration işlemleri sırasında beklenmedik hatalarla karşılaşabilirsiniz. En sık rastlanan sorunlardan biri, veritabanı ile model arasındaki "Snapshot" uyumsuzluğudur. Bu gibi durumlarda izlemeniz gereken stratejiler şunlardır:

  • Migration Geçmişini Kontrol Etmek: Veritabanınızda __EFMigrationsHistory tablosunu inceleyerek, hangi migration dosyalarının başarıyla uygulandığını doğrulayın.
  • SQL Script Üretimi: Hatanın tam olarak hangi SQL komutunda oluştuğunu anlamak için dotnet ef migrations script komutunu kullanarak, EF Core'un veritabanına göndermeye çalıştığı SQL kodunu inceleyin.
# Hata ayıklama için SQL script çıktısı al
dotnet ef migrations script -o migration.sql

Üretim Ortamında (Production) Migration Yönetimi

Geliştirme ortamında Update-Database komutunu kullanmak pratik olsa da, üretim ortamında (production) bu yöntem riskli olabilir. Profesyonel projelerde, veritabanı şemasını güncellemek için "Migration Bundle" veya "SQL Script" yöntemleri tercih edilmelidir.

Migration Bundle Kullanımı

Migration Bundle, uygulamanızın çalışması için gereken tüm migration'ları içeren tek bir yürütülebilir dosyadır. Bu, CI/CD süreçlerinde veritabanı güncellemelerini otomatize etmek için en güvenli yoldur.

# Migration Bundle oluşturma
dotnet ef migrations bundle --self-contained -r win-x64

Bu komut, hedef sunucuda .NET Runtime yüklü olmasa bile çalışabilen bir efbundle.exe dosyası üretir. Bu dosyayı sunucuda çalıştırmak, veritabanını otomatik olarak güncelleyecektir.

Veritabanı Güncelleme Stratejileri

Yöntem Avantajı Kullanım Alanı
Update-Database Hızlı ve kolay Yerel geliştirme (Local)
SQL Script DBA kontrolü sağlar Kurumsal/Güvenli ortamlar
Migration Bundle Otomatize edilebilir CI/CD süreçleri

İleri Seviye İpuçları: Veri Taşıma (Data Migration)

Bazen bir sütunu silip yerine başkasını eklerken mevcut verileri kaybetmemeniz gerekir. Bu durumda Up ve Down metotlarını manuel olarak düzenleyerek verileri dönüştürebilirsiniz.

protected override void Up(MigrationBuilder migrationBuilder)
{
    // Yeni sütun ekle
    migrationBuilder.AddColumn(name: "FullName", table: "Users", nullable: true);

    // Mevcut verileri birleştirerek taşı
    migrationBuilder.Sql("UPDATE Users SET FullName = FirstName + ' ' + LastName");

    // Eski sütunları sil
    migrationBuilder.DropColumn(name: "FirstName", table: "Users");
}

Bu yaklaşım, veritabanı şemanız değişirken kullanıcı verilerinizin bütünlüğünü korumanızı sağlar. Ancak, büyük veri setlerinde bu tür SQL işlemlerinin performans etkisini göz önünde bulundurmalısınız.

Sonuç

C# ile Entity Framework kullanarak migration yönetimi yapmak, veritabanı şemanızı kodunuzla senkronize tutmanın en güvenli yoludur. Bu rehberde öğrendiğiniz adımları takip ederek, veritabanı değişikliklerinizi kontrollü bir şekilde yönetebilirsiniz. Bir sonraki adım olarak, "Fluent API" kullanarak veritabanı kısıtlamalarını (constraints) daha detaylı nasıl yapılandırabileceğinizi araştırmanızı öneririm.

Güvenlik Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Uygulamalarınızda veritabanı bağlantı dizgilerini şifreleyin, kullanıcı girdilerini doğrulayın ve SQL Injection saldırılarına karşı her zaman EF Core'un sağladığı parametreli sorgu yapısını kullanın.
Bu yazıya tepkinizi paylaşın:
Kerem Demir

Dijital araçlar ve kişisel verimlilik üzerine uzmanlaşmış profesyonel bir yazarım. Karmaşık konuları basit ve anlaşılır kılmak için rehber odaklı içerikler üretiyorum.

Yorumlar (0)

Yorum Yaz