DevDataSeeder— config’ten okunan bootstrap admin’leri (hosted service).DistrictSeeder— 973 ilçe,SeedData/Districts.csvdosyasından (hosted service).- Fluent
HasData— Role, Permission ve RolePermission gibi referans verileri (migration ile kalıcı).
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 birSuperAdmin’i (ilk davet edeni) yazar.
Seed edilecek liste config’ten okunur:
- Liste boşsa no-op. Hiç kullanıcı yaratılmaz.
- İdempotent. Email zaten DB’deyse atlanır.
- Aktif yazılır.
ActivateOnExternalLogin()ileStatus = Active; ilk login’de ek adım kalmaz. - Factory + AssignRole. Kullanıcı
IUserFactoryile üretilir, rollerRoleenumeration’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:AppContext.BaseDirectory, sonra çalışma dizini):
Fluent HasData — referans verisi
Enumeration türevi roller ve varsayılan rol-izin matrisiIEntityTypeConfiguration 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):
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ı.