DiyanetCleanArchitecture.Infrastructure.EFCore projesi persistence (kalıcılık) katmanıdır. Domain aggregate’lerini PostgreSQL’e map eder, migration’ları üretir/uygular, audit + soft-delete davranışını tek bir interceptor üzerinden otomatikleştirir ve başlangıç verisini (seed) yazar.
Rolü
- Tek DbContext:
DiyanetCleanArchitectureDbContext : DbContext, IUnitOfWork— tüm aggregate’lerinDbSet’leri burada. - EntityTypeConfiguration’lar: Her aggregate için ayrı
IEntityTypeConfiguration<T>(Fluent API).OnModelCreatingbunları assembly’den reflection ile toplar. - Migration’lar:
Migrations/klasörü — EF Core code-first. - Interceptor:
AuditInterceptor : SaveChangesInterceptor—CreatedAt/By,UpdatedAt/By, soft-delete. - Repository’ler:
EFRepository<T>(write,Ardalis.Specificationtabanlı),CachedRepository<T>(read, HybridCache decorator). - Seed servisleri:
DevDataSeeder(bootstrap admin),DistrictSeeder(973 ilçe), FluentHasData(Role/RolePermission/Permission).
Teknoloji
| Bileşen | Seçim |
|---|---|
| Veritabanı | PostgreSQL 16 (dev: docker postgres:16) |
| Provider | Npgsql.EntityFrameworkCore.PostgreSQL 10.0.1 |
| EF Core | 10.0.7 |
| Naming | EFCore.NamingConventions 10.0.1 → UseSnakeCaseNamingConvention() |
| Specification | Ardalis.Specification.EntityFrameworkCore 9.3.1 |
| Outbox/Inbox | MassTransit.EntityFrameworkCore 8.5.9 |
UseSnakeCaseNamingConvention() sayesinde C# FullName → kolon full_name, RolePermission → tablo role_permission olur. EntityConfiguration’larda çoğu yerde HasColumnName açıkça yazılır; convention ise default davranıştır.
Şemalar
İki PostgreSQL şeması kullanılır:messaging şeması, MassTransit’in EF Core Outbox/Inbox tablolarını (inbox_state, outbox_state, outbox_message) business tablolarından ayrı tutar. Böylece infrastructure messaging detayı public şemasını kirletmez.
Hangfire ayrı bir
hangfire şeması kullanır ama bu, EFCore projesinin değil Infrastructure.Jobs.Hangfire projesinin sorumluluğundadır.Klasör yapısı
SaveChanges akışı
AuditInterceptor SaveChanges anında devreye girer; domain event dispatch ise SaveEntitiesAsync içinde SaveChanges sonrası çalışır. Detaylar ilgili sayfalarda.
Bu bölümde
DbContext & Repository
DbSet’ler, OnModelCreating, value object map’leme, EFRepository / CachedRepository, UnitOfWork.
Migrations
dotnet ef komutları, DesignTime factory, MigrationService AutoDeploy, migration listesi.Audit Interceptor
AuditInterceptor, IAuditUserContext, OnConfiguring’e eklenme nedeni.Soft Delete
ISoftDeletable, global query filter, restore, partial unique index.Seed Data
DevDataSeeder, DistrictSeeder, HasData, prod davranışı.