Skip to content

Entity Framework Core

Genel Bakış

Entity Framework Core (EF Core), .NET uygulamalarında veritabanı işlemlerini gerçekleştirmek için kullanılan bir Object-Relational Mapping (ORM) aracıdır. Veritabanı işlemlerini nesne yönelimli bir yaklaşımla gerçekleştirmeyi sağlar.

Mülakat Soruları ve Cevapları

1. Entity Framework Core nedir ve neden kullanılır?

Cevap: Entity Framework Core, veritabanı işlemlerini nesne yönelimli bir yaklaşımla gerçekleştirmeyi sağlayan bir ORM aracıdır. Kullanım nedenleri: - Veritabanı işlemlerini kolaylaştırır - LINQ desteği sunar - Cross-platform çalışabilir - Code First yaklaşımını destekler

Örnek Kod:

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

    public DbSet<Product> Products { get; set; }
    public DbSet<Category> Categories { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

2. DbContext ve DbSet nedir?

Cevap: DbContext: - Veritabanı bağlantısını yönetir - Entity'lerin yaşam döngüsünü kontrol eder - Change tracking sağlar - Transaction yönetimi yapar

DbSet: - Entity koleksiyonlarını temsil eder - CRUD operasyonlarını sağlar - LINQ sorgularına olanak tanır

Örnek Kod:

public class ProductService
{
    private readonly ApplicationDbContext _context;

    public ProductService(ApplicationDbContext context)
    {
        _context = context;
    }

    public async Task<List<Product>> GetAllProducts()
    {
        return await _context.Products
            .Include(p => p.Category)
            .ToListAsync();
    }

    public async Task AddProduct(Product product)
    {
        _context.Products.Add(product);
        await _context.SaveChangesAsync();
    }
}

3. Lazy Loading ve Eager Loading arasındaki farklar nelerdir?

Cevap: Lazy Loading: - İlişkili veriler ihtiyaç duyulduğunda yüklenir - Performans açısından daha maliyetli - N+1 problemi oluşturabilir - Proxies gerektirir

Eager Loading: - İlişkili veriler ana sorguyla birlikte yüklenir - Daha performanslı - Include metodu ile kullanılır - Tek sorgu ile veri çeker

Örnek Kod:

// Lazy Loading
public class Product
{
    public virtual Category Category { get; set; }
}

// Eager Loading
var products = await _context.Products
    .Include(p => p.Category)
    .ToListAsync();

4. Change Tracking nedir ve nasıl çalışır?

Cevap: Change Tracking: - Entity'lerdeki değişiklikleri takip eder - SaveChanges çağrıldığında değişiklikleri veritabanına yansıtır - EntityState ile durumları yönetir - Performans optimizasyonu sağlar

Örnek Kod:

public async Task UpdateProduct(Product product)
{
    var existingProduct = await _context.Products.FindAsync(product.Id);

    if (existingProduct != null)
    {
        // Change tracking otomatik olarak değişiklikleri takip eder
        existingProduct.Name = product.Name;
        existingProduct.Price = product.Price;

        await _context.SaveChangesAsync();
    }
}

5. Entity Framework Core'da performans optimizasyonu nasıl yapılır?

Cevap: Performans optimizasyonu için: - Eager Loading kullanın - Select ile sadece ihtiyaç duyulan alanları çekin - AsNoTracking kullanın - Batch işlemleri için AddRange kullanın

Örnek Kod:

// Sadece ihtiyaç duyulan alanları çekme
var products = await _context.Products
    .Select(p => new { p.Id, p.Name })
    .ToListAsync();

// Change tracking'i devre dışı bırakma
var products = await _context.Products
    .AsNoTracking()
    .ToListAsync();

// Batch insert
await _context.Products.AddRangeAsync(products);
await _context.SaveChangesAsync();

Best Practices

  1. DbContext Yönetimi
  2. Scoped lifetime kullanın
  3. Connection pooling'i etkinleştirin
  4. Dispose pattern'i uygulayın
  5. DbContext'i thread-safe kullanın

  6. Sorgu Optimizasyonu

  7. N+1 probleminden kaçının
  8. Gereksiz Include'lardan kaçının
  9. Index'leri doğru kullanın
  10. Raw SQL sorgularını dikkatli kullanın

  11. Migration Yönetimi

  12. Migration'ları version control'de tutun
  13. Seed data'yı düzenli güncelleyin
  14. Rollback stratejisi belirleyin
  15. Production migration'larını test edin

Kaynaklar