Skip to main content
Proje code-first EF Core kullanır. Migration’lar Infrastructure.EFCore/Migrations/ altında durur; runtime’da MigrationService (bir IHostedService) tarafından otomatik uygulanır.

Migration üretme

dotnet ef komutları DbContext’in bulunduğu projede (Infrastructure.EFCore) çalışır, ama configuration’ı (connection string) okuyabilmek için startup projesi (API) gösterilir:
Migration’ı geri almak (henüz DB’ye uygulanmadıysa):
İdempotent SQL script üretmek (DBA’nın manuel uyguladığı senaryo için):

DesignTimeDbContextFactory

dotnet ef design-time’da çalışırken DI container yoktur — runtime’daki IMediator, IEventBus, IAuditUserContext mevcut değildir. Bu yüzden DiyanetCleanArchitectureDesignTimeDbContextFactory, no-op dummy’lerle DbContext kurar:
NoAuditUserContext her zaman SystemActor.Id döner — design-time bir şekilde SaveChanges tetiklerse bile audit kolonlarına sağlam bir değer yazılır, exception fırlamaz. Base sınıf (DesignTimeDbContextFactoryBase) connection string’i API projesinin appsettings’inden okur:
Komutu Infrastructure.EFCore klasöründen çalıştırın; BasePath ../DiyanetCleanArchitecture.API’ye göre relatiftir. Connection string boşsa factory anlamlı bir hata fırlatır.

Migration uygulama — MigrationService

Runtime’da migration MigrationService : IHostedService ile uygulanır. Sadece config’te AutoDeploy=true ise çalışır:
Özellikler:
  • AutoDeploy guard: Kapalıysa hiçbir şey yapmaz.
  • Retry: En fazla 3 deneme, her başarısızlıkta 5 sn bekler. 3. denemede de patlarsa exception yeniden fırlatılır (uygulama başlamaz).
  • Database.MigrateAsync: Bekleyen tüm migration’ları uygular; DB yoksa oluşturur.
Konfigürasyon (appsettings.json):
MigrationService, AddInfrastructureEFCore içinde DevDataSeeder ve DistrictSeeder ile birlikte hosted service olarak kaydedilir.

Docker’da migration

Compose senaryolarında API container’ı AutoDeploy=true ile açılır; postgres servisi henüz hazır değilse MigrationService’in retry’ı (3×5 sn) köprü görevi görür. Tek instance’ta bu yeterlidir.
Çok-instance (replica) prod’da her replica MigrateAsync çalıştırırsa yarış oluşabilir. Bu durumda ya tek bir “migration job” container’ı AutoDeploy=true ile açılır, diğer API replica’larında AutoDeploy=false bırakılır; ya da migration CI/CD adımında idempotent SQL script ile uygulanır.

Migration listesi

Migrations/ klasöründeki migration’lar (kronolojik — uygulama sırası budur): Model değişikliklerinin tutarlılığı Migrations/DiyanetCleanArchitectureDbContextModelSnapshot.cs ile takip edilir — bu dosya elle düzenlenmez, EF tarafından yönetilir.

İlgili

DbContext & Repository

DbSet’ler, OnModelCreating, EntityTypeConfiguration örnekleri.

Seed Data

Migration HasData seed’leri ve hosted seeder’lar.

Soft Delete

Partial unique index (deleted_at IS NULL) migration’larda nasıl üretilir.

Data Genel Bakış

Katman rolü ve klasör yapısı.