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:
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 migrationMigrationService : IHostedService ile uygulanır. Sadece config’te AutoDeploy=true ise çalışır:
- 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.
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.
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ı.