EF Core ile CRUD İşlemleri
EF Core'un değişiklik izleme özelliğini ve SaveChanges'i kullanarak oluşturma, okuma, güncelleme ve silme işlemlerini gerçekleştirin.
EF Core ile CRUD İşlemleri, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
EF Core'da Oluşturma, Okuma, Güncelleme ve Silme İşlemlerine Genel Bakış
EF Core, dört işlemin tamamını — Oluşturma, Okuma, Güncelleme, Silme — değişiklik izleme ve SaveChangesAsync() bileşimiyle yönetir. Değişiklik izleyicisini anlamak, bu işlemlerde uzmanlaşmanın anahtarıdır.
Oluşturma: Yeni Varlık Ekleme
Bir varlığı Eklendi olarak işaretlemek için DbSet.Add() veya AddAsync() kullanın. SaveChangesAsync() çağrıldığında EF Core bir INSERT oluşturur ve otomatik artan anahtarı doldurur.
var order = new Order
{
CustomerId = 5,
PlacedAt = DateTime.UtcNow,
Status = OrderStatus.Pending
};
await _db.Orders.AddAsync(order);
await _db.SaveChangesAsync();
Console.WriteLine(order.Id); // populated by DBVarlık Grafiği Ekleme
Bir üst varlığı alt varlıklarıyla tek bir çağrıda eklemek, nesne grafiğinin tamamını ekler. EF Core, FK ilişkilerini otomatik olarak çözümler.
var order = new Order
{
CustomerId = 5,
PlacedAt = DateTime.UtcNow,
Lines = new List<OrderLine>
{
new() { ProductId = 10, Quantity = 2, Price = 49.99m },
new() { ProductId = 11, Quantity = 1, Price = 19.99m }
}
};
_db.Orders.Add(order);
await _db.SaveChangesAsync();
// Inserts Order + 2 OrderLines in one transactionOkuma: LINQ ile Sorgulama
EF Core, LINQ ifadelerini SQL'e çevirir. Sorguları Where, Select, OrderBy ve benzeri işleçlerle oluşturun, ardından ToListAsync veya FirstOrDefaultAsync ile somutlaştırın.
// Read all pending orders for a customer
var orders = await _db.Orders
.Where(o => o.CustomerId == 5 && o.Status == OrderStatus.Pending)
.OrderByDescending(o => o.PlacedAt)
.Select(o => new OrderSummaryDto
{
Id = o.Id,
Total = o.Lines.Sum(l => l.Quantity * l.Price),
Status = o.Status.ToString()
})
.ToListAsync();Okuma: Tekil Varlık Aramaları
Tekil varlıkları okumak için FindAsync (önce izleyicide arar) ya da bir koşul ifadesiyle FirstOrDefaultAsync / SingleOrDefaultAsync kullanın.
// By PK (checks cache first)
var order = await _db.Orders.FindAsync(orderId);
// By predicate (always hits DB)
var latest = await _db.Orders
.Where(o => o.CustomerId == 5)
.OrderByDescending(o => o.PlacedAt)
.FirstOrDefaultAsync();Güncelleme: Değişiklik İzleme
EF Core aracılığıyla yüklenen varlıklar izlenir. Özellikleri doğrudan değiştirin ve SaveChangesAsync() çağrısını yapın. EF Core farkı algılar ve yalnızca gerekli değişiklikleri içeren bir UPDATE ifadesi oluşturur.
var order = await _db.Orders.FindAsync(orderId);
if (order is null) return;
order.Status = OrderStatus.Shipped;
order.ShippedAt = DateTime.UtcNow;
await _db.SaveChangesAsync();
// UPDATE Orders SET Status=..., ShippedAt=... WHERE Id=orderIdGüncelleme: Toplu Güncelleme (EF Core 7+)
ExecuteUpdateAsync, varlıkları yüklemeden satırları doğrudan veritabanında günceller. Toplu işlemler için çok daha verimlidir.
// Mark all overdue orders as Cancelled — no loading needed
await _db.Orders
.Where(o => o.Status == OrderStatus.Pending
&& o.PlacedAt < DateTime.UtcNow.AddDays(-30))
.ExecuteUpdateAsync(set => set
.SetProperty(o => o.Status, OrderStatus.Cancelled)
.SetProperty(o => o.UpdatedAt, DateTime.UtcNow));Silme: Tek Bir Varlığı Kaldırma
İzlenen bir varlık üzerinde Remove() çağrısını, ardından SaveChangesAsync() çağrısını yapın. Elinizde yalnızca ID varsa önce varlığı bulun veya ExecuteDeleteAsync kullanın.
var order = await _db.Orders.FindAsync(orderId);
if (order is null) return;
_db.Orders.Remove(order);
await _db.SaveChangesAsync();
// DELETE FROM Orders WHERE Id=orderIdSilme: Toplu Silme (EF Core 7+)
ExecuteDeleteAsync, varlıkları yüklemeden tek bir DELETE SQL ifadesi çalıştırır — toplu temizlik işlemleri için idealdir.
// Delete all cancelled orders older than 1 year
int deleted = await _db.Orders
.Where(o => o.Status == OrderStatus.Cancelled
&& o.PlacedAt < DateTime.UtcNow.AddYears(-1))
.ExecuteDeleteAsync();
Console.WriteLine($"Deleted {deleted} old orders");İşlemler
Tek bir SaveChangesAsync çağrısı içindeki tüm işlemler bir işlemle sarmalanır. Birden fazla kaydetme işlemine yayılan çok adımlı işlemler için açık bir işlem kullanın.
using var transaction = await _db.Database.BeginTransactionAsync();
try
{
_db.Orders.Add(newOrder);
await _db.SaveChangesAsync();
inventory.Stock -= newOrder.Quantity;
await _db.SaveChangesAsync();
await transaction.CommitAsync();
}
catch
{
await transaction.RollbackAsync();
throw;
}Gerçek Hayattan: Eksiksiz Oluşturma, Okuma, Güncelleme ve Silme Hizmeti
Eksiksiz bir hizmet, tüm oluşturma, okuma, güncelleme ve silme işlemlerini uygun hata işleme ile kapsüller ve varlıkların iç ayrıntılarını açığa çıkarmamak için DTO'lar döndürür.
public async Task<OrderDto> CreateOrderAsync(CreateOrderRequest req)
{
var order = new Order { CustomerId = req.CustomerId, PlacedAt = DateTime.UtcNow };
_db.Orders.Add(order);
await _db.SaveChangesAsync();
return new OrderDto { Id = order.Id, Status = order.Status.ToString() };
}
public async Task<bool> CancelOrderAsync(int id)
{
int rows = await _db.Orders
.Where(o => o.Id == id && o.Status == OrderStatus.Pending)
.ExecuteUpdateAsync(s =>
s.SetProperty(o => o.Status, OrderStatus.Cancelled));
return rows > 0;
}Hızlı Kontrol
Varlıkları yükleyip SaveChangesAsync çağrısını yapmak yerine ExecuteUpdateAsync / ExecuteDeleteAsync kullanmanın avantajı nedir?
Özet: EF Core ile Oluşturma, Okuma, Güncelleme ve Silme İşlemleri
Önemli noktalar:
- Add + SaveChangesAsync → INSERT; EF Core otomatik oluşturulan anahtarları doldurur
- İzlenen varlıkları değiştirip SaveChangesAsync çağrısını yapmak → yalnızca gerekli değişiklikleri içeren UPDATE
- Remove + SaveChangesAsync → tekil varlıklar için DELETE
- ExecuteUpdateAsync / ExecuteDeleteAsync → varlıkları yüklemeden toplu işlemler (EF Core 7+)
- Atomikliği sağlamak için çok adımlı işlemleri açık bir işlemle sarmalayın
Sıkça Sorulan Sorular
“EF Core ile CRUD İşlemleri” dersi ücretsiz mi?
Evet — “EF Core ile CRUD İşlemleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“EF Core ile CRUD İşlemleri” dersinde ne öğreneceğim?
EF Core'un değişiklik izleme özelliğini ve SaveChanges'i kullanarak oluşturma, okuma, güncelleme ve silme işlemlerini gerçekleştirin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“EF Core ile CRUD İşlemleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- DbContext ve DbSet Temelleri
- Geçişler ve Şema Yönetimi
- EF Core ile CRUD İşlemleri
- İlişkiler: Bire Çok ve Çoka Çok