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):
| Migration | İçerik |
|---|---|
20260506111334_initial | Temel şema (User, Role, Organization, Location…) |
20260508073844_RolePermissionFix | RolePermission düzeltmesi |
20260513115344_userchange | User aggregate değişiklikleri |
20260514190633_ContentModules | Faq, Announcement, Center, SiteSettings |
20260518115056_CitizenAggregate | Citizen (vatandaş portalı) aggregate’i |
20260518202850_RolePermissionsRevamp | RolePermission Guid PK + partial unique index |
20260519130903_OutboxInboxMessagingSchema | MassTransit messaging şeması (outbox/inbox) |
20260522100332_BasvuruAggregates | Bağış & Etkinlik başvuru + plan aggregate’leri |
20260523185247_ProfileImageAndLegalDocuments | ProfileImage + LegalDocument/Version |
20260524132444_AddAdminNotifications | AdminNotification + per-user okuma kaydı |
20260525072317_AddSupportTickets | SupportTicket aggregate’i |
20260525073703_AddSupportTicketPermissions | Destek talebi izinleri (seed) |
20260531192628_AddAnnouncementCoverImage | Duyuru kapak görseli |
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ı.