Skip to main content
Başlangıç verisi üç ayrı kaynaktan gelir:
  1. DevDataSeeder — config’ten okunan bootstrap admin’leri (hosted service).
  2. DistrictSeeder — 973 ilçe, SeedData/Districts.csv dosyasından (hosted service).
  3. Fluent HasData — Role, Permission ve RolePermission gibi referans verileri (migration ile kalıcı).
Üçü de AddInfrastructureEFCore içinde kaydedilir:

DevDataSeeder — bootstrap admin

Yönetim paneli (admin realm’ı) davet bazlı çalışır: kullanıcı DB’de yoksa Keycloak login’i reddedilir. Yeni bir deployment’ın kilitlenmemesi için bu seeder en az bir SuperAdmin’i (ilk davet edeni) yazar. Seed edilecek liste config’ten okunur:
Çekirdek mantık (idempotent, factory + role atama):
Davranış özeti:
  • Liste boşsa no-op. Hiç kullanıcı yaratılmaz.
  • İdempotent. Email zaten DB’deyse atlanır.
  • Aktif yazılır. ActivateOnExternalLogin() ile Status = Active; ilk login’de ek adım kalmaz.
  • Factory + AssignRole. Kullanıcı IUserFactory ile üretilir, roller Role enumeration’dan eşleştirilir.
Dev test admin’leri (cihan.delipinar@diyanet.gov.tr, safa.goksel@diyanet.gov.tr) artık hardcoded değil; appsettings.Development.json içindeki SeedWork:BootstrapAdmins listesinde tanımlıdır.

DistrictSeeder — 973 ilçe

İlçeler CSV’den okunur ve DB’de olmayanlar eklenir. Tüm ortamlarda çalışır (City enumeration referans bütünlüğü için zorunlu) ve idempotenttir:
CSV iki konumdan aranır (önce AppContext.BaseDirectory, sonra çalışma dizini):
Dosya bulunamazsa uyarı loglanıp seeder atlanır (exception fırlatmaz).

Fluent HasData — referans verisi

Enumeration türevi roller ve varsayılan rol-izin matrisi IEntityTypeConfiguration içindeki HasData ile migration’a gömülür (kalıcı, versiyonlu). Role seed’i:
RolePermission seed’i deterministik Guid ile üretilir (migration tutarlılığı için sabit Id’ler şart):
HasData değerleri deterministik olmalı (DateTime.Now, Guid.NewGuid() gibi runtime değer KULLANILMAZ) — aksi halde her migration üretiminde model snapshot değişir ve gereksiz migration oluşur. Bu yüzden SeedDate sabittir ve Guid’ler Seed(...) ile hesaplanır.

Prod’da davranış

DevDataSeeder adı yanıltıcı olabilir: production’da otomatik olarak kapanan bir şey değildir; davranışını tamamen SeedWork:BootstrapAdmins config’i belirler. Listeyi boş bırakmak prod için güvenli default’tur.

İlgili

Migrations

MigrationService ve seed’lerin çalışma sırası.

DbContext & Repository

IUnitOfWork.SaveEntitiesAsync ve repository kullanımı.

Audit Interceptor

Seed sırasında SystemActor.Id’nin audit alanlarına yazılması.

Data Genel Bakış

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