EF Core vs Dapper: Hangisini Ne Zaman Kullanmalısınız?
.NET ekosisteminde veritabanı işlemleri denildiğinde akla gelen ilk iki teknoloji genellikle Entity Framework Core (EF Core) ve Dapper olur.
Birçok geliştirici şu sorunun cevabını arar:
EF Core mu kullanmalıyım yoksa Dapper mı?
Aslında bu sorunun tek bir doğru cevabı yoktur. Çünkü her iki teknoloji de farklı ihtiyaçları çözmek için tasarlanmıştır.
Bu yazıda EF Core ve Dapper'ı detaylı olarak inceleyecek, performans karşılaştırmalarına değinecek ve hangi senaryoda hangisinin tercih edilmesi gerektiğini açıklayacağız.
EF Core Nedir?
Entity Framework Core, Microsoft tarafından geliştirilen modern bir ORM'dir (Object Relational Mapper).
ORM'ler veritabanındaki tabloları nesnelere dönüştürerek SQL yazmadan veri işlemleri yapabilmemizi sağlar.
Örneğin aşağıdaki tabloyu düşünelim:
| Id | Name |
|---|---|
| 1 | Mustafa |
| 2 | Ahmet |
EF Core ile:
var users = await dbContext.Users.ToListAsync();
şeklinde veri çekebiliriz.
EF Core gerekli SQL sorgusunu otomatik olarak oluşturur.
Dapper Nedir?
Dapper, Stack Overflow ekibi tarafından geliştirilmiş hafif (Micro ORM) bir veri erişim kütüphanesidir.
EF Core'un aksine SQL yazımını geliştiriciye bırakır.
Örnek:
using var connection = new SqlConnection(connectionString);
var users = await connection.QueryAsync<User>(
"SELECT * FROM Users");
Burada SQL sorgusunu doğrudan biz yazıyoruz.
Dapper yalnızca sonucu nesnelere map etmektedir.
Temel Farklar
| Özellik | EF Core | Dapper |
|---|---|---|
| ORM Türü | Full ORM | Micro ORM |
| SQL Yazımı | Opsiyonel | Zorunlu |
| Öğrenme Eğrisi | Düşük | Orta |
| Performans | İyi | Çok Yüksek |
| Migration Desteği | Var | Yok |
| Change Tracking | Var | Yok |
| LINQ Desteği | Var | Yok |
| Karmaşık Query Kontrolü | Orta | Çok Yüksek |
| Bakım Kolaylığı | Yüksek | Orta |
Performans Karşılaştırması
Dapper'ın popüler olmasının en büyük sebebi performanstır.
Çünkü:
- SQL doğrudan çalıştırılır.
- Change Tracking yoktur.
- Expression Tree üretimi yoktur.
- LINQ çevirisi yapılmaz.
- ORM katmanı oldukça küçüktür.
Özellikle büyük veri setlerinde fark hissedilir hale gelir.
Örnek:
100.000 kayıt okunan bir senaryoda:
| Teknoloji | Ortalama Süre |
|---|---|
| Dapper | 40-80 ms |
| EF Core | 70-150 ms |
Bu değerler:
- Sunucuya
- Veritabanına
- Query yapısına
- Ağ gecikmesine
göre değişiklik gösterebilir.
Gerçek hayatta çoğu uygulamada fark milisaniyeler seviyesindedir.
EF Core'un Performansını Artırmak
Birçok geliştirici EF Core'un yavaş olduğunu düşünür.
Aslında doğru kullanıldığında oldukça başarılı sonuçlar elde edilebilir.
AsNoTracking Kullanımı
var users = await dbContext.Users
.AsNoTracking()
.ToListAsync();
Sadece okuma işlemlerinde performansı ciddi şekilde artırır.
Select Projection Kullanımı
Yanlış:
var users = await dbContext.Users.ToListAsync();
Doğru:
var users = await dbContext.Users
.Select(x => new UserDto
{
Id = x.Id,
Name = x.Name
})
.ToListAsync();
Gereksiz kolonlar çekilmez.
Compiled Queries
Sık kullanılan sorgular için:
private static readonly Func<AppDbContext, int, Task<User?>>
GetUserById =
EF.CompileAsyncQuery(
(AppDbContext db, int id) =>
db.Users.FirstOrDefault(x => x.Id == id));
ek performans sağlar.
Dapper'ın Avantajları
Maksimum Performans
Dapper'ın en büyük avantajıdır.
Özellikle:
- Dashboard uygulamaları
- Raporlama sistemleri
- Finans uygulamaları
- Gerçek zamanlı sistemler
için oldukça uygundur.
SQL Kontrolü
Tam kontrol geliştiricidedir.
SELECT
u.Id,
u.Name,
COUNT(o.Id) OrderCount
FROM Users u
LEFT JOIN Orders o ON o.UserId = u.Id
GROUP BY u.Id, u.Name
Yazılan SQL'in birebir çalışacağını bilirsiniz.
Daha Az Soyutlama
Bazı ekipler SQL'i gizlemek yerine doğrudan kullanmayı tercih eder.
Dapper burada büyük avantaj sağlar.
EF Core'un Avantajları
Hızlı Geliştirme
CRUD işlemleri son derece hızlı yazılır.
dbContext.Users.Add(user);
await dbContext.SaveChangesAsync();
Migration Desteği
dotnet ef migrations add InitialCreate
dotnet ef database update
Veritabanı şeması kod üzerinden yönetilebilir.
LINQ Desteği
var activeUsers = await dbContext.Users
.Where(x => x.IsActive)
.OrderBy(x => x.Name)
.ToListAsync();
Okunabilirlik oldukça yüksektir.
Change Tracking
EF Core değişiklikleri otomatik takip eder.
user.Name = "Yeni İsim";
await dbContext.SaveChangesAsync();
Ek UPDATE sorgusu yazmaya gerek kalmaz.
Ne Zaman EF Core Kullanılmalı?
Aşağıdaki durumlarda EF Core genellikle daha mantıklıdır:
- Kurumsal uygulamalar
- ERP sistemleri
- CRM sistemleri
- Yönetim panelleri
- İç operasyon uygulamaları
- Hızlı geliştirilmesi gereken projeler
- Büyük ekiplerle geliştirilen sistemler
Çünkü bakım maliyeti daha düşüktür.
Ne Zaman Dapper Kullanılmalı?
Aşağıdaki senaryolarda Dapper öne çıkar:
- Yüksek trafikli API'ler
- Finans uygulamaları
- Raporlama sistemleri
- Büyük veri sorguları
- Gerçek zamanlı uygulamalar
- Performansın kritik olduğu servisler
Hibrit Kullanım (En Yaygın Yaklaşım)
Aslında birçok büyük projede seçim “EF Core veya Dapper” değildir.
İkisi birlikte kullanılır.
Örnek:
- Write işlemleri → EF Core
- Read işlemleri → Dapper
Bu yaklaşım özellikle CQRS mimarisinde oldukça yaygındır.
Commands -> EF Core
Queries -> Dapper
Böylece:
- Geliştirme hızı korunur.
- Performans kritik sorgular optimize edilir.
Sonuç
EF Core ve Dapper rakip değil, farklı problemlere çözüm üreten araçlardır.
Özetlemek gerekirse:
- Hızlı geliştirme istiyorsanız → EF Core
- Maksimum performans istiyorsanız → Dapper
- Büyük ölçekli sistemlerde → EF Core + Dapper birlikte
Günümüzde birçok kurumsal projede EF Core ana ORM olarak kullanılırken, performans kritik sorgular Dapper ile optimize edilmektedir.
Doğru seçim, kullandığınız teknoloji değil, çözmeye çalıştığınız problemdir.