Skip to content

Entity Framework - Multiple Databases

Giriş

Entity Framework'te Multiple Databases (Çoklu Veritabanları), farklı veritabanlarını aynı uygulamada yönetmek için kullanılan gelişmiş bir özelliktir. Mid-level geliştiriciler için bu kavramın anlaşılması ve etkin kullanımı önemlidir.

Multiple Databases'ın Önemi

  1. Veri Yönetimi
  2. Farklı veritabanlarını yönetme
  3. Veri bölümleme
  4. Daha iyi veri organizasyonu
  5. Daha iyi veri erişimi

  6. Performans

  7. Yük dengeleme
  8. Ölçeklenebilirlik
  9. Daha hızlı sorgular
  10. Daha iyi kaynak kullanımı

  11. Güvenlik

  12. Veri izolasyonu
  13. Erişim kontrolü
  14. Güvenlik kontrolleri
  15. Audit logging

Multiple Databases Özellikleri

  1. Temel Multiple Database Konfigürasyonu

    public class MainDbContext : DbContext
    {
        public MainDbContext(DbContextOptions<MainDbContext> options)
            : base(options)
        {
        }
    
        public DbSet<User> Users { get; set; }
        public DbSet<Order> Orders { get; set; }
    }
    
    public class LogDbContext : DbContext
    {
        public LogDbContext(DbContextOptions<LogDbContext> options)
            : base(options)
        {
        }
    
        public DbSet<Log> Logs { get; set; }
    }
    
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<MainDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("MainDb")));
    
            services.AddDbContext<LogDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("LogDb")));
        }
    }
    

  2. Multiple Database Kullanımı

    public class UserService
    {
        private readonly MainDbContext _mainContext;
        private readonly LogDbContext _logContext;
    
        public UserService(MainDbContext mainContext, LogDbContext logContext)
        {
            _mainContext = mainContext;
            _logContext = logContext;
        }
    
        public async Task CreateUser(User user)
        {
            await _mainContext.Users.AddAsync(user);
            await _mainContext.SaveChangesAsync();
    
            await _logContext.Logs.AddAsync(new Log
            {
                Message = $"User created: {user.Id}",
                CreatedAt = DateTime.UtcNow
            });
            await _logContext.SaveChangesAsync();
        }
    }
    

  3. Multiple Database Validasyonu

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>(entity =>
        {
            entity.HasKey(e => e.Id);
            entity.Property(e => e.Name).IsRequired().HasMaxLength(100);
            entity.Property(e => e.Email).IsRequired().HasMaxLength(100);
        });
    
        modelBuilder.Entity<Log>(entity =>
        {
            entity.HasKey(e => e.Id);
            entity.Property(e => e.Message).IsRequired();
            entity.Property(e => e.CreatedAt).IsRequired();
        });
    }
    

Multiple Databases Kullanımı

  1. Entity İçinde Kullanım

    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
    }
    
    public class Log
    {
        public int Id { get; set; }
        public string Message { get; set; }
        public DateTime CreatedAt { get; set; }
    }
    
    public class UserService
    {
        private readonly MainDbContext _mainContext;
        private readonly LogDbContext _logContext;
    
        public UserService(MainDbContext mainContext, LogDbContext logContext)
        {
            _mainContext = mainContext;
            _logContext = logContext;
        }
    
        public async Task CreateUser(User user)
        {
            await _mainContext.Users.AddAsync(user);
            await _mainContext.SaveChangesAsync();
    
            await _logContext.Logs.AddAsync(new Log
            {
                Message = $"User created: {user.Id}",
                CreatedAt = DateTime.UtcNow
            });
            await _logContext.SaveChangesAsync();
        }
    }
    

  2. DbContext Konfigürasyonu

    public class MainDbContext : DbContext
    {
        public MainDbContext(DbContextOptions<MainDbContext> options)
            : base(options)
        {
        }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>(entity =>
            {
                entity.HasKey(e => e.Id);
                entity.Property(e => e.Name).IsRequired().HasMaxLength(100);
                entity.Property(e => e.Email).IsRequired().HasMaxLength(100);
            });
        }
    
        public DbSet<User> Users { get; set; }
    }
    
    public class LogDbContext : DbContext
    {
        public LogDbContext(DbContextOptions<LogDbContext> options)
            : base(options)
        {
        }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Log>(entity =>
            {
                entity.HasKey(e => e.Id);
                entity.Property(e => e.Message).IsRequired();
                entity.Property(e => e.CreatedAt).IsRequired();
            });
        }
    
        public DbSet<Log> Logs { get; set; }
    }
    

  3. Multiple Database Dönüşümleri

    public static class UserExtensions
    {
        public static async Task LogUserCreation(this User user, LogDbContext context)
        {
            await context.Logs.AddAsync(new Log
            {
                Message = $"User created: {user.Id}",
                CreatedAt = DateTime.UtcNow
            });
            await context.SaveChangesAsync();
        }
    }
    

Best Practices

  1. Multiple Database Tasarımı
  2. Single Responsibility
  3. Immutability
  4. Validation
  5. Business logic

  6. Güvenlik

  7. Data integrity
  8. Access control
  9. Audit logging
  10. Encryption

  11. Performans

  12. Connection pooling
  13. Query optimization
  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 Multiple Database nedir?
  2. Cevap: Multiple Database, farklı veritabanlarını aynı uygulamada yönetmek için kullanılan gelişmiş bir özelliktir.

  3. Entity Framework'te Multiple Database ve Single Database arasındaki fark nedir?

  4. Cevap: Single Database'de tüm veriler tek bir veritabanında tutulur, Multiple Database'de farklı veritabanları kullanılır.

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

  6. Cevap: Farklı DbContext sınıfları oluşturularak ve her biri için ayrı connection string tanımlanarak konfigüre edilir.

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

  8. Cevap: Farklı veritabanları kullanmak, veri bölümleme yapmak veya performansı artırmak için kullanılır.

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

  10. Cevap: Yük dengeleme ve ölçeklenebilirlik sağlayabilir ancak connection yönetimi gerektirir.

Teknik Sorular

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

    public class MainDbContext : DbContext
    {
        public MainDbContext(DbContextOptions<MainDbContext> options)
            : base(options)
        {
        }
    
        public DbSet<User> Users { get; set; }
    }
    
    public class LogDbContext : DbContext
    {
        public LogDbContext(DbContextOptions<LogDbContext> options)
            : base(options)
        {
        }
    
        public DbSet<Log> Logs { get; set; }
    }
    

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

  4. Cevap:

    public class UserService
    {
        private readonly MainDbContext _mainContext;
        private readonly LogDbContext _logContext;
    
        public UserService(MainDbContext mainContext, LogDbContext logContext)
        {
            _mainContext = mainContext;
            _logContext = logContext;
        }
    
        public async Task CreateUser(User user)
        {
            await _mainContext.Users.AddAsync(user);
            await _mainContext.SaveChangesAsync();
    
            await _logContext.Logs.AddAsync(new Log
            {
                Message = $"User created: {user.Id}",
                CreatedAt = DateTime.UtcNow
            });
            await _logContext.SaveChangesAsync();
        }
    }
    

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

  6. Cevap:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>(entity =>
        {
            entity.HasKey(e => e.Id);
            entity.Property(e => e.Name).IsRequired().HasMaxLength(100);
        });
    }
    

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

  8. Cevap:

    public static class UserExtensions
    {
        public static async Task LogUserCreation(this User user, LogDbContext context)
        {
            await context.Logs.AddAsync(new Log
            {
                Message = $"User created: {user.Id}",
                CreatedAt = DateTime.UtcNow
            });
            await context.SaveChangesAsync();
        }
    }
    

  9. Multiple Database nasıl test edilir?

  10. Cevap:
    [Test]
    public async Task CreateUser_ShouldCreateUserAndLog()
    {
        var mainOptions = new DbContextOptionsBuilder<MainDbContext>()
            .UseInMemoryDatabase("MainDb")
            .Options;
    
        var logOptions = new DbContextOptionsBuilder<LogDbContext>()
            .UseInMemoryDatabase("LogDb")
            .Options;
    
        using (var mainContext = new MainDbContext(mainOptions))
        using (var logContext = new LogDbContext(logOptions))
        {
            var service = new UserService(mainContext, logContext);
            var user = new User { Name = "Test User" };
    
            await service.CreateUser(user);
    
            Assert.IsTrue(mainContext.Users.Any(u => u.Name == "Test User"));
            Assert.IsTrue(logContext.Logs.Any(l => l.Message.Contains("User created")));
        }
    }
    

İleri Seviye Sorular

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

    • Connection pooling
    • Query optimizasyonu
    • Caching stratejileri
    • Lazy loading
    • Materialization optimizasyonu
  3. Entity Framework'te distributed sistemlerde Multiple Database nasıl yönetilir?

  4. Cevap:

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

  6. Cevap:

    • Locking stratejileri
    • Transaction isolation
    • Deadlock önleme
    • Retry mekanizmaları
    • Conflict resolution
  7. Entity Framework'te Multiple Database monitoring ve profiling nasıl yapılır?

  8. Cevap:

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

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