Entity Framework Core 3D logosu yanında veritabanı silindiri ve ORM eşleme bloğu bembeyaz arka planda premium kompozisyon

Entity Framework Core eğitimi, ORM'i "yavaş" diye geçiştirmek yerine doğru kullanmayı öğreten bir programdır. Code First, Database First ve Model First arasında karar; migration'ı versiyonlu kod artifact'ı olarak yönetme; Change Tracker'ın iç mekaniğini bilerek gereksiz tracking'i kapatma somut örneklerle işlenir.

Eğitim sonunda katılımcı, N+1 problemini Include, ThenInclude ve projection ile keser; compiled query ve no-tracking ile hot path optimize eder. Owned entity, value object ve TPH/TPT/TPC inheritance stratejisi; FromSqlInterpolated ile EF dışına çıkmadan ham SQL yazma eğitimin pratik kapanışıdır.

Katılımcı Profili

Bu eğitim, EF Core'u "yavaş ORM" yargısından kurtarmak isteyen .NET ekiplerine yöneliktir:

  • .NET Geliştiriciler: EF Core ile veri katmanı yazan mühendisler
  • Backend Mühendisleri: ORM tarafında query plan ve performansı önemseyen ekipler
  • Veritabanı Geliştiricileri: Code First ile Database First arasında karar veren roller
  • Migration Ekipleri: EF6 veya NHibernate'ten EF Core'a geçiş yapanlar
  • Solution Architect'ler: ORM ve veri erişim stratejisi belirleyen roller

Ön Gereklilikler

Bu eğitime katılım için aşağıdaki ön bilgiler önerilir:

  • C# ile temel sınıf ve nesne yönelimli programlama deneyimi
  • ASP.NET Core veya konsol uygulaması geliştirme rahatlığı
  • SQL ile temel sorgu yazma (SELECT, JOIN, WHERE)
  • İlişkisel veri modeli ve normalization kavramlarına aşinalık
  • Visual Studio veya VS Code kullanım deneyimi

Süresi ve Tarihi

Süre: 3 gün. Bu süre standart program içindir; ek modüllere ve hedefe göre süre özelleştirilebilir.
Eğitim tarihleri ve saatleri, ekibinizin uygunluğuna göre birlikte planlanır.

Kazanımlar

Eğitim sonunda katılımcı, EF Core'u "yavaş ORM" diye geçiştirmek yerine doğru kullanmayı öğrenir:

  • Code First, Database First ve Model First arasında karar verir
  • Migration'ı versiyonlu kod artifact'ı olarak yönetir
  • Change Tracker'ın nasıl çalıştığını bilir, gereksiz tracking'i kapatır
  • N+1 problemini Include, ThenInclude ve projection ile keser
  • Compiled query ve no-tracking ile hot path'i optimize eder
  • Owned entity, value object ve TPH/TPT/TPC stratejisi seçer
  • FromSqlInterpolated ile EF dışına çıkmadan ham SQL yazar

Entity Framework Core Eğitimi Konuları

1. EF Core Felsefesi ve EF6'dan Farkı

  • Cross-platform .NET, lightweight ve modüler tasarım
  • EF6 ile EF Core feature parity ve eksikler
  • Code First, Database First, Model First yaklaşımları
  • Provider modeli ve farklı veritabanı desteği
  • Resmi kaynak: EF Core belgeleri

2. DbContext, DbSet ve Tracking Mekanizması

  • DbContext yaşam döngüsü ve scope
  • DbContext pooling ile performans
  • DbSet<T> ve tracking davranışı
  • ChangeTracker API'si
  • Detached, Added, Modified, Deleted state'leri

3. Code First ve Migration

  • dotnet ef CLI komutları
  • add-migration, update-database, remove
  • Migration script üretimi (idempotent SQL)
  • Multiple branch migration çakışmaları
  • Zero-downtime migration stratejisi

4. Fluent API ve Data Annotations

  • Data Annotations: [Key], [Required], [MaxLength]
  • OnModelCreating ile Fluent API
  • IEntityTypeConfiguration ile organizasyon
  • Convention, attribute, fluent öncelik sırası

5. Entity İlişkileri - One-to-Many, Many-to-Many

  • One-to-one, one-to-many, many-to-many
  • Skip navigation ve implicit join entity
  • Foreign key ve principal/dependent ayrımı
  • Delete behavior: Cascade, SetNull, Restrict, NoAction

6. Owned Entity ve Value Object

  • Owned type ile aynı tabloda kompozisyon
  • Owned vs ayrı entity karar matrisi
  • DDD value object mapping
  • Complex type vs owned type

7. LINQ to SQL Çevirisi

  • Expression tree ve SQL provider çevirisi
  • Client-side vs server-side evaluation
  • Çevrilemeyen LINQ ifadeleri ve workaround
  • Generated SQL inceleme yöntemleri

8. IQueryable ve Deferred Execution

  • IQueryable vs IEnumerable farkı
  • ToList, ToArray ile execution tetikleme
  • Multiple enumeration tuzağı
  • AsAsyncEnumerable ile streaming

9. Eager, Lazy, Explicit Loading

  • Include ve ThenInclude ile eager loading
  • Lazy loading proxy ve dezavantajları
  • Explicit loading: Entry().Reference().LoadAsync()
  • Split query ile cartesian explosion önleme
  • N+1 problem tespiti ve çözümü

10. AsNoTracking ve Performans

  • Tracking maliyeti ve read-only senaryolar
  • AsNoTracking ve AsNoTrackingWithIdentityResolution
  • Projection ile gereksiz kolon atlamak
  • Connection pooling ve query plan caching

11. Raw SQL ve FromSqlRaw

  • FromSqlRaw ve FromSqlInterpolated farkı
  • SQL injection güvenliği
  • ExecuteSqlRaw, ExecuteSqlInterpolated
  • Keyless entity ve view mapping

12. Compiled Query ve Cold Start

  • EF.CompileQuery ile pre-compile
  • Query plan caching ve parameterization
  • Cold start optimizasyonu
  • Tiered compilation etkisi

13. Concurrency Token ve Optimistic Lock

  • RowVersion / Timestamp ile concurrency
  • ConcurrencyCheck attribute
  • DbUpdateConcurrencyException yönetimi
  • Client-wins, store-wins, custom resolve

14. Transaction ve Unit of Work

  • SaveChanges implicit transaction
  • BeginTransaction, Commit, Rollback
  • TransactionScope ile distributed
  • SaveChanges ve resilience: retry policy
  • Unit of Work pattern ve DbContext

15. Interceptor ve SaveChanges Pipeline

  • IInterceptor: DbCommandInterceptor, SaveChangesInterceptor
  • Audit log için interceptor kullanımı
  • Soft delete pattern interceptor ile
  • Connection ve command logging

16. Global Query Filter

  • HasQueryFilter ile soft delete
  • Multi-tenancy: tenant filter
  • IgnoreQueryFilters ile geçici kapatma
  • Filter ve compiled query etkileşimi

17. Database Provider - SQL Server, PostgreSQL, SQLite

  • SQL Server: Microsoft.EntityFrameworkCore.SqlServer
  • PostgreSQL: Npgsql provider ve farklılıklar
  • SQLite: in-memory test ve embedded
  • Cosmos DB ve NoSQL provider
  • Provider-specific feature kullanımı

18. EF Core Power Tools ve Reverse Engineering

  • Scaffold-DbContext ile database-first
  • EF Core Power Tools GUI
  • Migration bundle ile deployment
  • EF Core debug view ve diagnostic

ENTITY FRAMEWORK CORE EĞİTİMİ ile İlgili
Sıkça Sorulan Sorular ve Cevapları


Code First ile Database First arasında nasıl seçim yapılır?

Code First entity sınıflarından başlar, migration ile schema üretir — yeni proje ve domain-driven design için doğru. Database First mevcut DB'den entity üretir (Scaffold-DbContext); legacy DB ile çalışırken pratik. Çoğu yeni .NET projesi Code First tercih ediyor; takım disiplini şart.

Change Tracker performansı nasıl etkiler ve ne zaman kapatılır?

Change Tracker okunan her entity için snapshot tutar ve SaveChanges'te diff hesaplar. Read-only sorgularda gereksiz CPU ve memory yükü yaratır. AsNoTracking() ile kapatılır; raporlama, listeleme gibi senaryolarda 2-3x hız kazandırır. Sadece DTO projection yapılıyorsa zaten tracking devreye girmez.

N+1 problemini Include ile çözmek her zaman doğru mu?

Include eager loading sağlar ama büyük navigation property setlerinde Cartesian explosion riski yaratır — JOIN'lar şişer. Çözüm: AsSplitQuery() ile alt sorgulara böl, ya da Select projection ile sadece gereken kolonları tek query'e indir. EFCore loglamasını açıp gerçek SQL'i görmek karar verdirir.

Compiled query ve no-tracking ne zaman fark yaratır?

Compiled query (EF.CompileQuery) sorgu plan'ını cache'ler; hot path'te aynı query saniyede yüzlerce kez çağrıldığında %30+ throughput artırır. AsNoTracking read-only listing'de memory ve CPU kazancı verir. İkisi birlikte raporlama endpoint'lerinde belirgin gelişme sağlar.

TPH, TPT ve TPC inheritance stratejisi farkı?

Table-Per-Hierarchy (TPH): tüm türetilmiş sınıflar tek tabloda, discriminator kolon ile ayrılır — okuma hızlı, schema basit. Table-Per-Type (TPT): her sınıf için ayrı tablo — normalize ama JOIN maliyeti yüksek. Table-Per-Concrete (TPC): EF Core 7+ ile concrete sınıflar için ayrı tablo. Çoğu pratik proje TPH ile başlar.

FromSqlInterpolated güvenli SQL injection koruması veriyor mu?

Evet, FormattableString olarak interpolated string parametreleri otomatik DbParameter'a dönüştürür — SQL injection güvenli. Buna karşılık FromSqlRaw raw string alır, parametre manuel verilmeli. Mümkün olduğunca FromSqlInterpolated tercih edilir; tablo veya kolon adı dinamikse o ayrı bir konu.