UZMAN
Compiled Models (EF Core 8+)
Büyük modellerde (200+ entity) uygulama başlangıç süresi saniyeler alabilir — EF Core her seferinde model'i reflection ile yeniden oluşturur.
Ne Zaman Kullanmalısın?
| Senaryo | Compiled Model? | Neden |
|---|---|---|
| <50 entity | Startup zaten <500ms | |
| 50-200 entity | Opsiyonel | 1-3s ise değerlendirilebilir |
| 200+ entity | Startup 5-15s olabilir — ciddi fark yaratır | |
| Serverless (Azure Functions) | Cold start kritik | |
| Unit test projesi | Her test class'ında model değişebilir |
Kullanım
# 1. Compiled model oluştur (build sırasında veya CI'da)
dotnet ef dbcontext optimize --output-dir CompiledModels --namespace MyApp.CompiledModels
# Sonuç: CompiledModels/ klasöründe C# dosyaları oluşur
# Her entity için bir partial class + tüm metadata pre-computed
// 2. DbContext'te compiled model'i kullan
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(connectionString)
.UseModel(MyApp.CompiledModels.AppDbContextModel.Instance)); // Pre-built model
Kısıtlamalar ve Trade-off'lar
| Kısıt | Açıklama | EF Core Sürüm |
|---|---|---|
| Model değiştiğinde yeniden generate | Migration sonrası dotnet ef dbcontext optimize tekrar çalıştırılmalı |
6+ |
| Lazy-loading desteklenmez | Compiled model ile proxy oluşturulmaz (EF9'da kaldırılması planlanıyor) | 6-8 |
| Global query filter'da değişken | Runtime değişkenler (tenant ID) hâlâ çalışır | 6+ |
| CI/CD entegrasyonu | Build pipeline'a dbcontext optimize adımı eklenmeli |
6+ |
| NativeAOT desteği | Compiled models NativeAOT publish için zorunlu | 8+ |
CI'da otomatikleştirme: Migration oluşturan pipeline adımından sonra
dotnet ef dbcontext optimizeçalıştırıp generated dosyaları commit edin. Böylece production'da her zaman güncel compiled model kullanılır.
// ❌ Compiled model OLMADAN startup (200 entity):
// Model building: ~4200ms (her app start'ta)
// ✅ Compiled model İLE startup (200 entity):
// Model loading: ~180ms (pre-computed, reflection yok)