Skip to main content
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’lerin DbSet’leri burada.
  • EntityTypeConfiguration’lar: Her aggregate için ayrı IEntityTypeConfiguration<T> (Fluent API). OnModelCreating bunları assembly’den reflection ile toplar.
  • Migration’lar: Migrations/ klasörü — EF Core code-first.
  • Interceptor: AuditInterceptor : SaveChangesInterceptorCreatedAt/By, UpdatedAt/By, soft-delete.
  • Repository’ler: EFRepository<T> (write, Ardalis.Specification tabanlı), CachedRepository<T> (read, HybridCache decorator).
  • Seed servisleri: DevDataSeeder (bootstrap admin), DistrictSeeder (973 ilçe), Fluent HasData (Role/RolePermission/Permission).

Teknoloji

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ışı.