EFEF Core Handbook

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)