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ı) ortamdadatabase updatekomutunu doğrudan çalıştırmayın. Bunun yerinedotnet ef migrations scriptkomutuyla 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
__EFMigrationsHistorytablosunu 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 scriptkomutunu 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.


Yorumlar (0)
Yorum Yaz