Skip to content

Entity Framework - Database Functions

Giriş

Entity Framework'te Database Functions (Veritabanı Fonksiyonları), veritabanı seviyesinde çalışan ve LINQ sorgularında kullanılabilen fonksiyonlardır. Mid-level geliştiriciler için bu kavramın anlaşılması ve etkin kullanımı önemlidir.

Database Functions'ın Önemi

  1. Veri Yönetimi
  2. Veritabanı seviyesinde işlem yapma
  3. Daha iyi veri organizasyonu
  4. Daha iyi veri bütünlüğü
  5. Daha iyi veri erişimi

  6. Performans

  7. Veritabanı seviyesinde optimizasyon
  8. Daha az veri transferi
  9. Daha hızlı sorgular
  10. Daha iyi kaynak kullanımı

  11. Bakım

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

Database Functions Özellikleri

  1. Temel Database Function

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDbFunction(typeof(MyDbContext)
            .GetMethod(nameof(CalculateAge), new[] { typeof(DateTime) }))
            .HasName("CalculateAge");
    
        modelBuilder.HasDbFunction(typeof(MyDbContext)
            .GetMethod(nameof(FormatDate), new[] { typeof(DateTime), typeof(string) }))
            .HasName("FormatDate");
    }
    
    public static int CalculateAge(DateTime birthDate)
    {
        throw new NotSupportedException();
    }
    
    public static string FormatDate(DateTime date, string format)
    {
        throw new NotSupportedException();
    }
    

  2. Database Function Kullanımı

    public class UserService
    {
        private readonly DbContext _context;
    
        public UserService(DbContext context)
        {
            _context = context;
        }
    
        public List<User> GetUsersByAge(int age)
        {
            return _context.Users
                .Where(u => MyDbContext.CalculateAge(u.BirthDate) == age)
                .ToList();
        }
    
        public List<User> GetUsersWithFormattedBirthDate(string format)
        {
            return _context.Users
                .Select(u => new
                {
                    u.Id,
                    u.Name,
                    FormattedBirthDate = MyDbContext.FormatDate(u.BirthDate, format)
                })
                .ToList();
        }
    }
    

  3. Database Function Validasyonu

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDbFunction(typeof(MyDbContext)
            .GetMethod(nameof(CalculateAge), new[] { typeof(DateTime) }))
            .HasName("CalculateAge")
            .HasParameter("birthDate")
            .HasStoreType("date");
    
        modelBuilder.HasDbFunction(typeof(MyDbContext)
            .GetMethod(nameof(FormatDate), new[] { typeof(DateTime), typeof(string) }))
            .HasName("FormatDate")
            .HasParameter("date")
            .HasStoreType("datetime")
            .HasParameter("format")
            .HasStoreType("nvarchar(50)");
    }
    

Database Functions Kullanımı

  1. Entity İçinde Kullanım

    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime BirthDate { get; set; }
    }
    
    public class UserService
    {
        private readonly DbContext _context;
    
        public UserService(DbContext context)
        {
            _context = context;
        }
    
        public List<User> GetUsersByAge(int age)
        {
            return _context.Users
                .Where(u => MyDbContext.CalculateAge(u.BirthDate) == age)
                .ToList();
        }
    
        public List<User> GetUsersWithFormattedBirthDate(string format)
        {
            return _context.Users
                .Select(u => new
                {
                    u.Id,
                    u.Name,
                    FormattedBirthDate = MyDbContext.FormatDate(u.BirthDate, format)
                })
                .ToList();
        }
    }
    

  2. DbContext Konfigürasyonu

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDbFunction(typeof(MyDbContext)
            .GetMethod(nameof(CalculateAge), new[] { typeof(DateTime) }))
            .HasName("CalculateAge")
            .HasParameter("birthDate")
            .HasStoreType("date");
    
        modelBuilder.HasDbFunction(typeof(MyDbContext)
            .GetMethod(nameof(FormatDate), new[] { typeof(DateTime), typeof(string) }))
            .HasName("FormatDate")
            .HasParameter("date")
            .HasStoreType("datetime")
            .HasParameter("format")
            .HasStoreType("nvarchar(50)");
    }
    

  3. Database Function Dönüşümleri

    public static class UserExtensions
    {
        public static IQueryable<User> FilterByAge(this IQueryable<User> query, int age)
        {
            return query.Where(u => MyDbContext.CalculateAge(u.BirthDate) == age);
        }
    
        public static IQueryable<User> FormatBirthDate(this IQueryable<User> query, string format)
        {
            return query.Select(u => new
            {
                u.Id,
                u.Name,
                FormattedBirthDate = MyDbContext.FormatDate(u.BirthDate, format)
            });
        }
    }
    

Best Practices

  1. Database Function 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. Query optimization
  13. Index kullanımı
  14. Caching
  15. Lazy loading

  16. Bakım

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

Mülakat Soruları

Temel Sorular

  1. Entity Framework'te Database Function nedir?
  2. Cevap: Database Function, veritabanı seviyesinde çalışan ve LINQ sorgularında kullanılabilen fonksiyonlardır.

  3. Entity Framework'te Database Function ve Normal Function arasındaki fark nedir?

  4. Cevap: Normal Function'lar uygulama seviyesinde çalışır, Database Function'lar veritabanı seviyesinde çalışır.

  5. Entity Framework'te Database Function nasıl konfigüre edilir?

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

  7. Entity Framework'te Database Function ne zaman kullanılır?

  8. Cevap: Veritabanı seviyesinde işlem yapmak, performansı artırmak veya veri bütünlüğünü sağlamak için kullanılır.

  9. Entity Framework'te Database Function performansı nasıl etkiler?

  10. Cevap: Veritabanı seviyesinde çalıştığı için performansı artırabilir ancak veritabanı yükünü de artırabilir.

Teknik Sorular

  1. Temel Database Function nasıl oluşturulur?
  2. Cevap:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDbFunction(typeof(MyDbContext)
            .GetMethod(nameof(CalculateAge), new[] { typeof(DateTime) }))
            .HasName("CalculateAge");
    }
    
    public static int CalculateAge(DateTime birthDate)
    {
        throw new NotSupportedException();
    }
    

  3. Database Function nasıl kullanılır?

  4. Cevap:

    public List<User> GetUsersByAge(int age)
    {
        return _context.Users
            .Where(u => MyDbContext.CalculateAge(u.BirthDate) == age)
            .ToList();
    }
    

  5. Database Function validasyonu nasıl yapılır?

  6. Cevap:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDbFunction(typeof(MyDbContext)
            .GetMethod(nameof(CalculateAge), new[] { typeof(DateTime) }))
            .HasName("CalculateAge")
            .HasParameter("birthDate")
            .HasStoreType("date");
    }
    

  7. Database Function nasıl özelleştirilir?

  8. Cevap:

    public static class UserExtensions
    {
        public static IQueryable<User> FilterByAge(this IQueryable<User> query, int age)
        {
            return query.Where(u => MyDbContext.CalculateAge(u.BirthDate) == age);
        }
    }
    

  9. Database Function nasıl test edilir?

  10. Cevap:
    [Test]
    public void CalculateAge_ShouldReturnCorrectAge()
    {
        var birthDate = new DateTime(1990, 1, 1);
        var expectedAge = DateTime.Now.Year - birthDate.Year;
        var actualAge = MyDbContext.CalculateAge(birthDate);
        Assert.AreEqual(expectedAge, actualAge);
    }
    

İleri Seviye Sorular

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

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

  4. Cevap:

    • Consistency
    • Replication
    • Sharding
    • Partitioning
    • Caching
  5. Entity Framework'te high concurrency senaryolarında Database Function nasıl yönetilir?

  6. Cevap:

    • Thread safety
    • Atomic operations
    • Locking stratejileri
    • Isolation levels
    • Conflict resolution
  7. Entity Framework'te Database Function monitoring ve profiling nasıl yapılır?

  8. Cevap:

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

  10. Cevap:
    • Custom function handling
    • Custom validation
    • Custom optimization
    • Custom caching
    • Custom materialization