Skip to content

Entity Framework - Change Tracking

Giriş

Entity Framework'te Change Tracking (Değişiklik İzleme), veritabanı nesnelerindeki değişiklikleri otomatik olarak takip eden ve yöneten bir mekanizmadır. Mid-level geliştiriciler için bu mekanizmanın anlaşılması ve etkin kullanımı kritik öneme sahiptir.

Change Tracking'in Önemi

  1. Veri Tutarlılığı
  2. Otomatik değişiklik takibi
  3. Veri bütünlüğü koruması
  4. İlişkisel veri yönetimi
  5. Transaction yönetimi

  6. Performans

  7. Optimize edilmiş güncellemeler
  8. Gereksiz sorguların önlenmesi
  9. Batch işlem desteği
  10. Bellek kullanımı optimizasyonu

  11. Bakım

  12. Daha az kod
  13. Daha kolay debug
  14. Daha iyi test edilebilirlik
  15. Daha kolay bakım

Change Tracking Özellikleri

  1. Entity States

    // Entity durumları
    var blog = new Blog { Title = "Yeni Blog" };
    var state = _context.Entry(blog).State; // Detached
    
    _context.Blogs.Add(blog);
    state = _context.Entry(blog).State; // Added
    
    await _context.SaveChangesAsync();
    state = _context.Entry(blog).State; // Unchanged
    
    blog.Title = "Güncellenmiş Blog";
    state = _context.Entry(blog).State; // Modified
    
    _context.Blogs.Remove(blog);
    state = _context.Entry(blog).State; // Deleted
    

  2. Change Detection

    // Değişiklik tespiti
    var blog = await _context.Blogs.FindAsync(1);
    var originalValues = _context.Entry(blog).OriginalValues;
    var currentValues = _context.Entry(blog).CurrentValues;
    
    // Değişiklik kontrolü
    var hasChanges = _context.ChangeTracker.HasChanges();
    
    // Değişen entity'ler
    var modifiedEntities = _context.ChangeTracker
        .Entries()
        .Where(e => e.State == EntityState.Modified)
        .ToList();
    
    // Değişen property'ler
    var modifiedProperties = _context.Entry(blog)
        .Properties
        .Where(p => p.IsModified)
        .ToList();
    

  3. Change Tracking Modları

    // Change tracking modları
    // 1. Snapshot Change Tracking
    var options = new DbContextOptionsBuilder()
        .UseSqlServer(connectionString)
        .UseChangeTrackingStrategy(ChangeTrackingStrategy.Snapshot)
        .Options;
    
    // 2. ChangedNotifications Change Tracking
    var options = new DbContextOptionsBuilder()
        .UseSqlServer(connectionString)
        .UseChangeTrackingStrategy(ChangeTrackingStrategy.ChangedNotifications)
        .Options;
    
    // 3. Change Tracking'i devre dışı bırakma
    var blog = await _context.Blogs
        .AsNoTracking()
        .FirstOrDefaultAsync(b => b.Id == 1);
    

  4. Bulk Operations

    // Toplu güncelleme
    var blogs = await _context.Blogs.ToListAsync();
    foreach (var blog in blogs)
    {
        blog.Rating += 1;
    }
    
    // Change tracking'i geçici olarak devre dışı bırakma
    _context.ChangeTracker.AutoDetectChangesEnabled = false;
    try
    {
        // Toplu işlemler
        foreach (var blog in blogs)
        {
            _context.Blogs.Update(blog);
        }
        await _context.SaveChangesAsync();
    }
    finally
    {
        _context.ChangeTracker.AutoDetectChangesEnabled = true;
    }
    

  5. Custom Change Tracking

    // Özel change tracking
    public class BlogChangeTracker : IEntityChangeTracker
    {
        public void TrackChanges(DbContext context)
        {
            var entries = context.ChangeTracker.Entries();
            foreach (var entry in entries)
            {
                if (entry.State == EntityState.Modified)
                {
                    var blog = entry.Entity as Blog;
                    if (blog != null)
                    {
                        blog.LastModified = DateTime.UtcNow;
                        blog.ModifiedBy = "System";
                    }
                }
            }
        }
    }
    
    // Kullanımı
    var changeTracker = new BlogChangeTracker();
    changeTracker.TrackChanges(_context);
    

Best Practices

  1. Change Tracking Tasarımı
  2. Uygun tracking modu seçimi
  3. Gereksiz tracking'den kaçınma
  4. Batch işlemlerde optimizasyon
  5. Bellek kullanımı yönetimi

  6. Performans

  7. AutoDetectChanges optimizasyonu
  8. Batch işlem stratejileri
  9. Bellek yönetimi
  10. Query optimizasyonu

  11. Güvenlik

  12. Değişiklik doğrulama
  13. Audit logging
  14. Concurrency kontrolü
  15. Transaction yönetimi

  16. Bakım

  17. Kod organizasyonu
  18. Documentation
  19. Testing
  20. Error handling

Mülakat Soruları

Temel Sorular

  1. Entity Framework'te Change Tracking nedir?
  2. Cevap: Change Tracking, veritabanı nesnelerindeki değişiklikleri otomatik olarak takip eden ve yöneten bir mekanizmadır.

  3. Entity Framework'te entity state'ler nelerdir?

  4. Cevap: Detached, Added, Unchanged, Modified ve Deleted state'leri vardır.

  5. Entity Framework'te change tracking modları nelerdir?

  6. Cevap: Snapshot ve ChangedNotifications modları vardır.

  7. Entity Framework'te change tracking nasıl devre dışı bırakılır?

  8. Cevap: AsNoTracking() metodu veya AutoDetectChangesEnabled = false ile devre dışı bırakılabilir.

  9. Entity Framework'te değişiklikler nasıl tespit edilir?

  10. Cevap: ChangeTracker.Entries() veya Entry(entity).Properties ile tespit edilir.

Teknik Sorular

  1. Entity state'leri nasıl kontrol edilir?
  2. Cevap:

    var state = _context.Entry(entity).State;
    var states = _context.ChangeTracker.Entries()
        .Select(e => new { Entity = e.Entity, State = e.State })
        .ToList();
    

  3. Değişiklikleri nasıl izlenir?

  4. Cevap:

    var originalValues = _context.Entry(entity).OriginalValues;
    var currentValues = _context.Entry(entity).CurrentValues;
    var modifiedProperties = _context.Entry(entity)
        .Properties
        .Where(p => p.IsModified)
        .ToList();
    

  5. Change tracking modu nasıl değiştirilir?

  6. Cevap:

    var options = new DbContextOptionsBuilder()
        .UseSqlServer(connectionString)
        .UseChangeTrackingStrategy(ChangeTrackingStrategy.Snapshot)
        .Options;
    

  7. Toplu işlemlerde change tracking nasıl optimize edilir?

  8. Cevap:

    _context.ChangeTracker.AutoDetectChangesEnabled = false;
    try
    {
        // Toplu işlemler
        await _context.SaveChangesAsync();
    }
    finally
    {
        _context.ChangeTracker.AutoDetectChangesEnabled = true;
    }
    

  9. Özel change tracking nasıl implemente edilir?

  10. Cevap:
    public class CustomChangeTracker : IEntityChangeTracker
    {
        public void TrackChanges(DbContext context)
        {
            var entries = context.ChangeTracker.Entries();
            foreach (var entry in entries)
            {
                if (entry.State == EntityState.Modified)
                {
                    // Özel işlemler
                }
            }
        }
    }
    

İleri Seviye Sorular

  1. Entity Framework'te change tracking performansı nasıl optimize edilir?
  2. Cevap:

    • AutoDetectChanges optimizasyonu
    • Batch işlem stratejileri
    • Bellek yönetimi
    • Query optimizasyonu
    • Index kullanımı
  3. Entity Framework'te distributed sistemlerde change tracking nasıl yönetilir?

  4. Cevap:

    • Change tracking stratejileri
    • Replication
    • Consistency
    • Conflict resolution
    • Transaction yönetimi
  5. Entity Framework'te high concurrency senaryolarında change tracking nasıl yönetilir?

  6. Cevap:

    • Optimistic concurrency
    • Pessimistic concurrency
    • Retry mekanizmaları
    • Queue yönetimi
    • Batch processing
  7. Entity Framework'te change tracking monitoring ve profiling nasıl yapılır?

  8. Cevap:

    • Change tracking logging
    • Performance metrics
    • Resource monitoring
    • Profiling tools
    • Health checks
  9. Entity Framework'te custom change tracking stratejileri nasıl geliştirilir?

  10. Cevap:
    • IEntityChangeTracker implementasyonu
    • Custom state management
    • Custom change detection
    • Custom validation
    • Custom persistence