Skip to content

Entity Framework - Shadow Properties

Giriş

Entity Framework'te Shadow Properties (Gölge Özellikler), entity sınıfında tanımlanmayan ancak veritabanında bulunan özelliklerdir. Mid-level geliştiriciler için bu kavramın anlaşılması ve etkin kullanımı önemlidir.

Shadow Properties'ın Önemi

  1. Veri Yönetimi
  2. Veritabanı kolonlarını entity'den gizleme
  3. Daha iyi veri organizasyonu
  4. Daha iyi veri bütünlüğü
  5. Daha iyi veri erişimi

  6. Güvenlik

  7. Hassas verileri gizleme
  8. Veri erişimini kontrol etme
  9. Audit logging
  10. Güvenlik kontrolleri

  11. Bakım

  12. Daha az kod tekrarı
  13. Daha kolay test edilebilirlik
  14. Daha iyi modülerlik
  15. Daha kolay genişletilebilirlik

Shadow Properties Özellikleri

  1. Temel Shadow Property

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property<DateTime>("CreatedDate")
            .HasDefaultValueSql("GETDATE()");
    
        modelBuilder.Entity<Blog>()
            .Property<DateTime>("LastModifiedDate")
            .HasDefaultValueSql("GETDATE()");
    }
    

  2. Shadow Property Kullanımı

    public class BlogService
    {
        private readonly DbContext _context;
    
        public BlogService(DbContext context)
        {
            _context = context;
        }
    
        public void UpdateBlog(int id, string title)
        {
            var blog = _context.Blogs.Find(id);
            if (blog != null)
            {
                blog.Title = title;
                _context.Entry(blog).Property("LastModifiedDate").CurrentValue = DateTime.UtcNow;
                _context.SaveChanges();
            }
        }
    
        public DateTime GetBlogCreatedDate(int id)
        {
            var blog = _context.Blogs.Find(id);
            return _context.Entry(blog).Property("CreatedDate").CurrentValue;
        }
    }
    

  3. Shadow Property Validasyonu

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property<DateTime>("CreatedDate")
            .IsRequired()
            .HasDefaultValueSql("GETDATE()");
    
        modelBuilder.Entity<Blog>()
            .Property<DateTime>("LastModifiedDate")
            .IsRequired()
            .HasDefaultValueSql("GETDATE()");
    
        modelBuilder.Entity<Blog>()
            .Property<string>("CreatedBy")
            .IsRequired()
            .HasMaxLength(50);
    }
    

Shadow Properties Kullanımı

  1. Entity İçinde Kullanım

    public class Blog
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
    }
    
    public class BlogService
    {
        private readonly DbContext _context;
    
        public BlogService(DbContext context)
        {
            _context = context;
        }
    
        public void CreateBlog(string title, string content, string createdBy)
        {
            var blog = new Blog
            {
                Title = title,
                Content = content
            };
    
            _context.Add(blog);
            _context.Entry(blog).Property("CreatedBy").CurrentValue = createdBy;
            _context.SaveChanges();
        }
    
        public void UpdateBlog(int id, string title)
        {
            var blog = _context.Blogs.Find(id);
            if (blog != null)
            {
                blog.Title = title;
                _context.Entry(blog).Property("LastModifiedDate").CurrentValue = DateTime.UtcNow;
                _context.SaveChanges();
            }
        }
    }
    

  2. DbContext Konfigürasyonu

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>(entity =>
        {
            entity.Property<DateTime>("CreatedDate")
                .IsRequired()
                .HasDefaultValueSql("GETDATE()");
    
            entity.Property<DateTime>("LastModifiedDate")
                .IsRequired()
                .HasDefaultValueSql("GETDATE()");
    
            entity.Property<string>("CreatedBy")
                .IsRequired()
                .HasMaxLength(50);
    
            entity.Property<string>("LastModifiedBy")
                .IsRequired()
                .HasMaxLength(50);
        });
    }
    

  3. Shadow Property Dönüşümleri

    public static class BlogExtensions
    {
        public static BlogDto ToDto(this Blog blog, DbContext context)
        {
            return new BlogDto
            {
                Id = blog.Id,
                Title = blog.Title,
                Content = blog.Content,
                CreatedDate = context.Entry(blog).Property<DateTime>("CreatedDate").CurrentValue,
                CreatedBy = context.Entry(blog).Property<string>("CreatedBy").CurrentValue,
                LastModifiedDate = context.Entry(blog).Property<DateTime>("LastModifiedDate").CurrentValue,
                LastModifiedBy = context.Entry(blog).Property<string>("LastModifiedBy").CurrentValue
            };
        }
    }
    

Best Practices

  1. Shadow Property Tasarımı
  2. Single Responsibility
  3. Immutability
  4. Validation
  5. Business logic

  6. Güvenlik

  7. Input validation
  8. Data integrity
  9. Access control
  10. Audit logging

  11. Performans

  12. Memory usage
  13. Query optimization
  14. Lazy loading
  15. Caching

  16. Bakım

  17. Code organization
  18. Documentation
  19. Testing
  20. Versioning

Mülakat Soruları

Temel Sorular

  1. Entity Framework'te Shadow Property nedir?
  2. Cevap: Shadow Property, entity sınıfında tanımlanmayan ancak veritabanında bulunan özelliklerdir.

  3. Entity Framework'te Shadow Property ve Normal Property arasındaki fark nedir?

  4. Cevap: Normal Property'ler entity sınıfında tanımlanır ve doğrudan erişilebilir, Shadow Property'ler entity sınıfında tanımlanmaz ve DbContext üzerinden erişilir.

  5. Entity Framework'te Shadow Property nasıl konfigüre edilir?

  6. Cevap: DbContext.OnModelCreating metodunda Property metodu kullanılarak konfigüre edilir.

  7. Entity Framework'te Shadow Property ne zaman kullanılır?

  8. Cevap: Veritabanı kolonlarını entity'den gizlemek, hassas verileri gizlemek veya audit logging için kullanılır.

  9. Entity Framework'te Shadow Property performansı nasıl etkiler?

  10. Cevap: Memory kullanımını azaltabilir ancak erişim için ek kod gerektirir.

Teknik Sorular

  1. Temel Shadow Property nasıl oluşturulur?
  2. Cevap:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property<DateTime>("CreatedDate")
            .HasDefaultValueSql("GETDATE()");
    }
    

  3. Shadow Property nasıl kullanılır?

  4. Cevap:

    public void UpdateBlog(int id, string title)
    {
        var blog = _context.Blogs.Find(id);
        if (blog != null)
        {
            blog.Title = title;
            _context.Entry(blog).Property("LastModifiedDate").CurrentValue = DateTime.UtcNow;
            _context.SaveChanges();
        }
    }
    

  5. Shadow Property validasyonu nasıl yapılır?

  6. Cevap:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property<string>("CreatedBy")
            .IsRequired()
            .HasMaxLength(50);
    }
    

  7. Shadow Property değeri nasıl okunur?

  8. Cevap:

    public DateTime GetBlogCreatedDate(int id)
    {
        var blog = _context.Blogs.Find(id);
        return _context.Entry(blog).Property("CreatedDate").CurrentValue;
    }
    

  9. Shadow Property değeri nasıl güncellenir?

  10. Cevap:
    public void UpdateBlog(int id, string title)
    {
        var blog = _context.Blogs.Find(id);
        if (blog != null)
        {
            blog.Title = title;
            _context.Entry(blog).Property("LastModifiedDate").CurrentValue = DateTime.UtcNow;
            _context.SaveChanges();
        }
    }
    

İleri Seviye Sorular

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

    • Memory kullanımı optimizasyonu
    • Query optimizasyonu
    • Lazy loading
    • Caching stratejileri
    • Index kullanımı
  3. Entity Framework'te distributed sistemlerde Shadow Property nasıl yönetilir?

  4. Cevap:

    • Serialization
    • Versioning
    • Migration
    • Consistency
    • Conflict resolution
  5. Entity Framework'te high concurrency senaryolarında Shadow Property nasıl yönetilir?

  6. Cevap:

    • Immutability
    • Thread safety
    • Atomic operations
    • Versioning
    • Conflict resolution
  7. Entity Framework'te Shadow Property monitoring ve profiling nasıl yapılır?

  8. Cevap:

    • Memory profiling
    • Performance metrics
    • Resource monitoring
    • Profiling tools
    • Health checks
  9. Entity Framework'te custom Shadow Property stratejileri nasıl geliştirilir?

  10. Cevap:
    • Custom property handling
    • Custom validation
    • Custom serialization
    • Custom conversion
    • Custom optimization