0Pricing
C# Academy · Ders

DbContext ve DbSet Temelleri

Bir DbContext kurun, varlıkları tanımlayın, bağlantı dizesini yapılandırın ve ilk sorgunuzu çalıştırın.

DbContext ve DbSet Temelleri, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 1. 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.

Entity Framework Core Nedir

EF Core, resmi .NET Nesne-İlişkisel Eşleyicisidir (ORM). C# sınıflarını (varlıkları) veritabanı tablolarına eşler ve çoğu işlem için SQL yazmayı gerektirmeden LINQ kullanarak verileri sorgulayıp kaydetmenize olanak tanır.

Varlık Tanımlama

Varlık, özellikleri veritabanı sütunlarına eşlenen sıradan bir C# sınıfıdır. Kural olarak Id veya <TypeName>Id adlı bir özellik birincil anahtar olur.

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public decimal Price { get; set; }
    public int Stock { get; set; }
    public DateTime CreatedAt { get; set; }
}

DbContext Oluşturma

DbContext, veritabanına açılan geçittir. Her varlık için DbSet<T> özelliklerini barındırır ve bağlantıyı, değişiklik izlemeyi ve işlemleri yönetir.

using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options)
        : base(options) { }

    public DbSet<Product> Products => Set<Product>();
    public DbSet<Order>   Orders   => Set<Order>();
}

DbContext'in DI ile kaydedilmesi

DbContext'i kapsam başına oluşturulan bir hizmet olarak kaydetmek ve veritabanı sağlayıcısını yapılandırmak için Program.cs içinde AddDbContext çağrısını yapın.

builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(
        builder.Configuration.GetConnectionString("Default")));

// For SQLite (great for development/testing):
// options.UseSqlite("Data Source=app.db");

DbSet ile Temel Sorgular

DbSet<T>, LINQ işleçlerini sunar. Sorgular, numaralandırılana (await ...ToListAsync()) kadar yürütülmez. Buna ertelenmiş yürütme denir.

public class ProductService
{
    private readonly AppDbContext _db;
    public ProductService(AppDbContext db) => _db = db;

    public async Task<List<Product>> GetExpensiveAsync(decimal minPrice)
    {
        return await _db.Products
            .Where(p => p.Price >= minPrice)
            .OrderBy(p => p.Name)
            .ToListAsync();
    }
}

Birincil Anahtarla Bulma

FindAsync, veritabanına erişmeden önce yerel değişiklik izleyicisi önbelleğini kontrol eder. Gereksiz gidiş gelişleri önlemek için birincil anahtara göre sorgulama yaparken bunu kullanın.

var product = await _db.Products.FindAsync(42);
if (product is null)
    throw new KeyNotFoundException("Product not found");

// For complex keys, pass all key values:
var orderLine = await _db.OrderLines.FindAsync(orderId, productId);

Yeni Kayıtlar Ekleme

Bir varlığı eklenmek üzere sıraya almak için Add çağrısını, ardından kalıcılaştırmak için SaveChangesAsync çağrısını yapın. EF Core, INSERT SQL'ini oluşturur ve otomatik olarak oluşturulan Id değerini doldurur.

var product = new Product
{
    Name = "Mechanical Keyboard",
    Price = 149.99m,
    Stock = 50,
    CreatedAt = DateTime.UtcNow
};

_db.Products.Add(product);
await _db.SaveChangesAsync();

Console.WriteLine(product.Id); // Auto-generated PK

Kayıtları Güncelleme

EF Core tarafından yüklenen varlıklar izlenir. Özellikleri doğrudan değiştirin ve SaveChangesAsync çağrısını yapın — EF Core değişiklikleri algılar ve eniyileştirilmiş bir UPDATE ifadesi oluşturur.

var product = await _db.Products.FindAsync(42);
if (product is not null)
{
    product.Price = 129.99m;
    product.Stock -= 1;
    await _db.SaveChangesAsync(); // UPDATE Products SET Price=...
}

Kayıtları Silme

Bir varlığı silinmek üzere işaretlemek için Remove çağrısını, ardından SaveChangesAsync çağrısını yapın. Varlıkları yüklemeden toplu silme işlemleri için .NET 7 ve sonraki sürümlerde ExecuteDeleteAsync kullanın.

// Delete a tracked entity
_db.Products.Remove(product);
await _db.SaveChangesAsync();

// Bulk delete without loading (EF Core 7+)
await _db.Products
    .Where(p => p.Stock == 0)
    .ExecuteDeleteAsync();

Akıcı Programlama Arayüzüyle Yapılandırma

Varlıkları; tablo adlarını, sütun türlerini, kısıtlamaları, dizinleri ve ilişkileri yapılandırmak için OnModelCreating yöntemini geçersiz kılarak Akıcı Programlama Arayüzünü kullanın.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>(entity =>
    {
        entity.ToTable("products");
        entity.Property(p => p.Name).IsRequired().HasMaxLength(200);
        entity.Property(p => p.Price).HasColumnType("decimal(18,2)");
        entity.HasIndex(p => p.Name);
    });
}

Gerçek Hayattan: DbContext Kullanan Depo

Tipik bir depo, veri erişimi mantığını merkezileştirmek ve sorgu ayrıntılarını hizmet sınıflarının dışında tutmak için DbContext'i kapsüller.

public class ProductRepository : IProductRepository
{
    private readonly AppDbContext _db;
    public ProductRepository(AppDbContext db) => _db = db;

    public async Task<Product?> GetByIdAsync(int id)
        => await _db.Products.AsNoTracking().FirstOrDefaultAsync(p => p.Id == id);

    public async Task<List<Product>> SearchAsync(string query)
        => await _db.Products
            .Where(p => p.Name.Contains(query))
            .AsNoTracking()
            .ToListAsync();
}

Hızlı Kontrol

EF Core ile sorgulama yaparken AsNoTracking() ne işe yarar?

Özet: DbContext ve DbSet Temelleri

Önemli noktalar:

  • DbContext, veritabanıyla olan oturumdur; DbSet<T> bir tabloyu temsil eder
  • DI içinde AddDbContext ile kaydedilir; varsayılan olarak kapsam başına oluşturulur
  • LINQ sorguları ertelenir — ToListAsync ve FirstOrDefaultAsync ile yürütülür
  • Değişiklik izleme, SaveChangesAsync aracılığıyla otomatik UPDATE/DELETE işlemlerini mümkün kılar
  • Salt okunur sorgularda performansı artırmak için AsNoTracking() kullanın

Sıkça Sorulan Sorular

“DbContext ve DbSet Temelleri” dersi ücretsiz mi?

Evet — “DbContext ve DbSet Temelleri” 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.

“DbContext ve DbSet Temelleri” dersinde ne öğreneceğim?

Bir DbContext kurun, varlıkları tanımlayın, bağlantı dizesini yapılandırın ve ilk sorgunuzu çalıştırın. 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 1. dersidir.

“DbContext ve DbSet Temelleri” 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

  1. DbContext ve DbSet Temelleri
  2. Geçişler ve Şema Yönetimi
  3. EF Core ile CRUD İşlemleri
  4. İlişkiler: Bire Çok ve Çoka Çok
← C# Academy Sayfasına Dön