Türkçe production reference
EF Core Geliştirici El Kitabı
EF Core 8, 9 ve 10 ile veri modelleme, sorgulama, migrations, performans ve production uygulama kalıpları.
REHBER HAKKINDA
Kapsam ve production odağı
KAPSAMNeyi çözüyor?DbContext yaşam döngüsünden ilişki ve migration tasarımına; LINQ çevirisi, tracking, concurrency, transaction, retry, testing ve diagnostics konularına kadar veri erişim katmanını uçtan uca ele alır.
OKUYUCUKimler için?EF Core öğrenen .NET geliştiricileri, veri erişim katmanını production'a hazırlayan ekipler ve sorgu performansı, migration veya provider farklarıyla çalışan teknik liderler içindir.
PRODUCTIONTemel ilkelerDbContext örneklerini kısa ömürlü tutun, yalnızca gereken alanları projection ile alın, migration'ları kontrollü deployment adımı yapın ve provider davranışlarını integration testlerle doğrulayın.
TEMEL
Temel Seviye
TEMELGirişBu doküman, Entity Framework Core ile çalışan .NET geliştiricileri için kapsamlı bir başvuru kaynağıdır. Başlangıç seviyesinden uzman konulara kadar kademeli bir öğrenme yolu sunar.TEMELDbContext & DbSet KurulumuDbContext, uygulama ile veritabanı arasındaki köprüdür. Her sorgu, her kayıt bu köprüden geçer.TEMELIEntityTypeConfiguration — Ayrı Config SınıflarıEntity konfigürasyonlarını ayrı sınıflara ayırmak, DbContext'in OnModelCreating metodunu şişirmeden her entity'nin kurallarını kendi dosyasında yönetmeni sağlar.TEMELEntity Type Configuration — Tablo / ŞemaEntity'nin hangi tabloya, hangi schema'ya map edileceğini belirler. Varsayılan olarak EF Core, DbSet adını tablo adı olarak kullanır. Farklı bir tablo adı, schema veya view'a yönlendirmek istediğinde bu ayarları kullanırsın.TEMELPrimary Key YapılandırmasıHer tablonun bir primary key'i olmalıdır. EF Core, Id veya <EntityName>Id adlı property'yi otomatik PK olarak algılar. Farklı bir yapı istiyorsan (composite key, GUID, identity kontrolü) Fluent API ile belirtirsin.TEMELProperty (Sütun) YapılandırmasıC# property'lerinin veritabanındaki sütunlara nasıl dönüşeceğini kontrol eder: veri tipi, uzunluk, null olup olmayacağı, varsayılan değer, computed column gibi.TEMELIndex YapılandırmasıIndex, sorgu performansını doğrudan etkiler. WHERE, ORDER BY veya JOIN sık kullandığın sütunlara index koymak sorguyu tablonun tamamını taramaktan kurtarır.
ORTA
Orta Seviye
ORTAİlişki Yapılandırması (Relationships)Entity'ler arası bağlantıları (One-to-One, One-to-Many, Many-to-Many) Fluent API ile tanımlar. Temel kural: ilişki her zaman FK'nın bulunduğu entity'nin config'inde yazılır.ORTAMigrations (Göçler)C# modelinde yaptığın her değişikliği (yeni tablo, sütun ekleme, tip değiştirme) veritabanına taşıyan versiyonlama sistemidir. Git commit'leri gibi düşün — her migration bir "DB commit".ORTASeed Data (Başlangıç Verisi)Veritabanı ilk oluştuğunda veya test ortamında ihtiyaç duyulan başlangıç verilerini (kategoriler, roller, ülke listesi gibi) otomatik eklemek için kullanılır.ORTALoading Strategies (Veri Yükleme)Bir entity'yi çektiğinde ilişkili verileri (navigation property'ler) ne zaman ve nasıl yükleyeceğini belirler. Yanlış tercih N+1 problemine yol açar — yüzlerce gereksiz sorgu.ORTAChange Tracking & PerformanceEF Core, DB'den çektiğin her entity'nin o anki değerlerini bir kopya olarak saklar. SaveChanges() dediğinde eski ve yeni değerleri karşılaştırır, sadece değişen alanlar için UPDATE üretir.ORTALINQ → SQL Çeviri RehberiEF Core, LINQ ifadelerini SQL'e çevirir. Her operatörün nasıl SQL'e dönüştüğünü bilmek, performanslı ve doğru sorgu yazmanın temelidir. Bu bölüm her LINQ metodu için karşılık gelen SQL'i gösterir — kopyala-yapıştır referansı.ORTAProjection & DTO MappingVeritabanından sadece ihtiyacın olan sütunları çeker — tüm entity'yi yüklemek yerine. Include() tüm sütunları getirir, Select() sadece belirttiklerini.
İLERİ
İleri Seviye
İLERİOwned Entities (Sahipli Varlıklar)Bağımsız kimliği olmayan, her zaman sahibiyle birlikte var olan alt nesneleri aynı tabloda saklar. Adres, koordinat, para birimi gibi yapılar için — ayrı tablo + FK gerektirmez.İLERİComplex Types — EF Core 8+Owned Entity'nin modern alternatifi. Kimliği (Id) olmayan, birden fazla entity'de tekrar kullanabileceğin değer nesneleri tanımlar. Para birimi, koordinat, renk gibi yapılar için.İLERİKalıtım (Inheritance) — TPH / TPT / TPCOrtak bir base class'tan türeyen entity'leri veritabanında nasıl saklayacağını belirler. Üç strateji var: TPH (tek tablo, en hızlı), TPT (her tip ayrı tablo, normalize), TPC (her somut tip ayrı tablo, birleşik sorgu yok).İLERİValue ConvertersC# tarafında zengin tipler (enum, DateOnly, custom class) kullanırken bunların veritabanında hangi formatta saklanacağını belirler. Örneğin enum'ı string olarak saklamak, ya da Money nesnesini decimal sütuna dönüştürmek.İLERİShadow PropertiesC# entity class'ında tanımlanmayan ama veritabanında var olan sütunlar. Entity'yi "kirletmeden" audit alanları (CreatedAt, ModifiedBy), FK'lar veya altyapısal sütunlar eklemek için kullanılır.İLERİGlobal Query FiltersModel düzeyinde tanımlanan, o entity'ye yapılan tüm sorgulara otomatik eklenen WHERE koşulları. Soft delete (IsDeleted), multi-tenancy (TenantId) gibi her sorguda tekrar tekrar yazılması gereken filtreleri tek noktada tanımlarsın.İLERİSequence & Default ValuesSequence, veritabanı seviyesinde sıralı numara üreten bir nesne. Identity'den farkı: INSERT öncesinde numara alabilirsin (sipariş numarası gibi).İLERİConcurrency TokensAynı kaydı iki kullanıcı aynı anda güncellemeye çalıştığında veri kaybını önleyen mekanizma. EF Core "optimistic concurrency" kullanır — kayıt okunduğundaki versiyonu saklar, UPDATE sırasında versiyon değişmişse hata fırlatır.İLERİRaw SQL & TransactionsEF Core'un LINQ çevirisi her senaryoya yetmez — karmaşık sorgular, performans-kritik SQL'ler veya stored procedure çağrıları için raw SQL kullanırsın.İLERİPagination PatternsListe sayfalarında veriyi parça parça getirmek için iki yaklaşım var: Offset (Skip/Take — basit, her yerde çalışır) ve Keyset/Cursor (performanslı, büyük veri setleri için).İLERİQuery Tags & DebuggingProduction'da yavaş sorgu gördüğünde hangi koddan geldiğini bulmak için TagWith() ile sorguya yorum eklersin. Ayrıca geliştirme sırasında ToQueryString() ile LINQ'un ürettiği SQL'i debug edebilirsin.İLERİTesting with EF CoreEF Core kullanan kodu test etmek için üç yaklaşım var: SQLite In-Memory (hızlı, çoğu senaryo için yeterli), TestContainers (gerçek DB, en güvenilir), ve InMemory provider (artık önerilmiyor).İLERİBulk & Batch OperationsTek tek SaveChanges() çağırmak 1000 kayıtta 1000 ayrı SQL üretir. Toplu işlemler (ExecuteUpdate, ExecuteDelete, BulkExtensions) bunu tek veya birkaç SQL'e indirir.İLERİGlobal Exception Handling & RetryVeritabanı hataları kaçınılmaz: deadlock, timeout, constraint violation, connection drop. Bu hataları doğru yakalamak (hangi exception = hangi hata), kullanıcıya anlamlı mesaj vermek ve geçici hatalar için retry mekanizması kurmak production stabilitesi için şart.
UZMAN
Uzman Seviye
UZMANJSON Columns — EF Core 7+İlişkili verileri ayrı tabloda tutmak yerine aynı satırda JSON sütunu olarak saklar. Ayrı tablo + JOIN gerektirmez. Adres, ayarlar, metadata gibi her zaman parent ile birlikte okunan veriler için ideal.UZMANPrimitive Collections — EF Core 8+List<string>, int[], List<DayOfWeek> gibi basit tip koleksiyonları artık ayrı tablo gerektirmeden JSON sütununa otomatik saklanır. Tags, roller, izin listeleri gibi basit diziler için ayrı ilişki tablosu açmak yerine bu özelliği kullan.UZMANInterceptorsEF Core'un veritabanı işlemlerine (SaveChanges, komut çalıştırma, bağlantı açma) araya girme mekanizması. Audit logging, soft delete otomasyonu, slow query loglama, query manipulation gibi cross-cutting concern'leri merkezi bir noktada çözer — her repository'ye kod yazmak yerine.UZMANTemporal Tables — Zamansal TablolarSQL Server'ın built-in özelliği — her satırın tüm geçmiş versiyonlarını otomatik saklar. "Bu müşterinin adresi 3 ay önce neydi?" gibi sorulara cevap verir.UZMANKeyless Entities — View & SP MappingPrimary key'i olmayan sonuç setlerini (View'lar, Stored Procedure sonuçları, Raw SQL DTO'ları) EF Core modeline map eder. HasNoKey() ile tanımlanır, Change Tracking yapılmaz, salt okunurdur.UZMANConnection Resiliency & DbContext PoolingBulut ortamlarında geçici ağ hataları kaçınılmaz. Retry mekanizması yoksa uygulama ilk geçici hatada çöker. Connection Resiliency otomatik yeniden deneme sağlar; DbContext Pooling ise context nesne oluşturma maliyetini azaltarak throughput artırır.UZMANTable Splitting & Entity SplittingTek tabloyu birden fazla entity olarak okumak (Table Splitting — büyük BLOB sütunlarını lazy load etmek için) veya tek entity'yi birden fazla tabloya yaymak (Entity Splitting — sık/nadir okunan alanları ayırmak için) imkanı verir.UZMANSoft Delete Pattern (Tam Implementasyon)Veriyi fiziksel olarak silmek yerine IsDeleted = true flag'i ile gizleme. Yasal saklama zorunlulukları, geri alma (undo) ihtiyacı ve veri kaybı riskini ortadan kaldırır.UZMANEF.Functions — Provider-Specific FonksiyonlarLINQ'ta doğrudan yazılamayan veritabanı-özel fonksiyonları (LIKE, DATEPART, Full-Text Search, Vector Search) kullanmak için EF.Functions namespace'ini kullanırsın.UZMANCompiled QueriesAynı LINQ sorgusu her çağrıda expression tree'den SQL'e yeniden derlenir. Yoğun endpoint'lerde (saniyede binlerce istek) bu derleme maliyeti birikir.UZMANMulti-Tenancy PatternsTek uygulama ile birden fazla kiracıya (müşteri/organizasyon) hizmet vermek. Üç yaklaşım: aynı tabloda discriminator sütunu (basit), kiracı başına ayrı schema (orta), kiracı başına ayrı veritabanı (tam izolasyon).UZMANAudit Trail Pattern (Tam Implementasyon)Kim, ne zaman, hangi alanı, eski değerden yeni değere değiştirdi? KVKK, SOX, HIPAA uyumluluğu ve debug için kritik. SaveChanges override veya Interceptor ile her değişiklik otomatik loglanır — entity kodlarına dokunmadan.UZMANVeri Koruma — Encryption, Hashing & MaskingProduction'da hassas veri (TC kimlik, kart no, şifre) saklama kaçınılmaz. Üç farklı strateji: Encrypt (şifrele/çöz — geri dönüşümlü), Hash (tek yönlü özetle — şifreler için), Mask (görünümü gizle — loglama/raporlama için).UZMANCompiled 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.UZMANDiagnostics & ProfilingProduction'da sorguların ne kadar sürdüğünü, kaç sorgu çalıştığını ve N+1 problemlerini tespit etmek için EF Core diagnostics araçlarını kullan.UZMANYeniden Kullanılabilir IQueryable Metotlar — Subquery TuzağıTekrarlayan sorgu mantığını DRY tutmak için IQueryable extension method'ları yazılır. Ama EF Core bu metotları birleştirirken subquery oluşturabilir — bu da gereksiz nested SELECT'lere, index kullanılmamasına ve ciddi performans kaybına yol açar.
REFERANS
Referans
REFERANSProvider Uyumluluğu — SQL Server, PostgreSQL, Oracle, SQLiteEF Core'un Fluent API'sinin %90'ı provider-agnostic çalışır. Ancak bazı özellikler (Temporal Tables, JSON sütun syntax'ı, index tipleri) provider'a özgüdür.REFERANSCustom Conventions — EF Core 7+Modeldeki tüm entity'lere otomatik uygulanan kurallar. "Her string en fazla 256 karakter olsun", "Her tabloda CreatedAt shadow property olsun", "Her FK'ya index koy" gibi DRY kurallar bir kere yazılır, tüm entity'lere uygulanır — her config'te tekrar yazmaya gerek kalmaz.REFERANSData Annotations Hızlı ReferansFluent API yerine attribute bazlı yapılandırma. Basit senaryolarda hızlıdır ama Fluent API kadar güçlü değildir (composite index, owned entity gibi şeyler attribute ile yapılamaz).REFERANSConventions ÖzetleriEF Core, model oluşturulurken varsayılan kurallar (conventions) uygular: Id → PK, int → IDENTITY, navigation property → FK, DbSet adı → tablo adı.REFERANSHızlı Referans TablosuEn sık kullanılan Fluent API metodları ve SQL karşılıkları — hızlıca bakıp kopyalamak için.REFERANSDocker ile SQL Server & PostgreSQL KurulumuLocal development için veritabanlarını Docker container olarak çalıştırmak en hızlı ve tekrarlanabilir yöntemdir. Bu bölüm: container kurulumu, EF Core bağlantı yapılandırması, migration uygulaması ve production-ready docker-compose senaryolarını kapsar.REFERANSKısaltmalar & TerimlerEF Core 8, 9 ve 10 ile veri modelleme, sorgulama, migrations, performans ve production uygulama kalıpları.REFERANSChangelogKaynak: Microsoft EF Core Docs · EF Core 8 / 9 / 10 What's New