Skip to content

Entity Framework - Custom Migrations

Giriş

Entity Framework'te Custom Migrations (Özel Migrasyonlar), veritabanı şemasını özelleştirmek ve veri dönüşümlerini 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.

Custom Migrations'ın Önemi

  1. Veri Yönetimi
  2. Veritabanı şemasını özelleştirme
  3. Veri dönüşümlerini yönetme
  4. Daha iyi veri bütünlüğü
  5. Daha iyi veri erişimi

  6. Bakım

  7. Daha kolay şema yönetimi
  8. Daha kolay veri dönüşümü
  9. Daha iyi modülerlik
  10. Daha kolay genişletilebilirlik

  11. Güvenlik

  12. Veri bütünlüğünü koruma
  13. Veri dönüşümlerini güvenli yapma
  14. Rollback stratejileri
  15. Güvenlik kontrolleri

Custom Migrations Özellikleri

  1. Temel Custom Migration

    public partial class AddUserFullName : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn<string>(
                name: "FullName",
                table: "Users",
                nullable: true);
    
            migrationBuilder.Sql(
                @"UPDATE Users 
                  SET FullName = FirstName + ' ' + LastName");
        }
    
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(
                name: "FullName",
                table: "Users");
        }
    }
    

  2. Custom Migration Kullanımı

    public class UserService
    {
        private readonly DbContext _context;
    
        public UserService(DbContext context)
        {
            _context = context;
        }
    
        public void UpdateUserFullName(int userId, string fullName)
        {
            var user = _context.Users.Find(userId);
            if (user != null)
            {
                user.FullName = fullName;
                _context.SaveChanges();
            }
        }
    }
    

  3. Custom Migration Validasyonu

    public partial class AddUserFullName : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn<string>(
                name: "FullName",
                table: "Users",
                maxLength: 100,
                nullable: false,
                defaultValue: "");
    
            migrationBuilder.Sql(
                @"UPDATE Users 
                  SET FullName = FirstName + ' ' + LastName
                  WHERE FullName IS NULL");
    
            migrationBuilder.CreateIndex(
                name: "IX_Users_FullName",
                table: "Users",
                column: "FullName");
        }
    
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropIndex(
                name: "IX_Users_FullName",
                table: "Users");
    
            migrationBuilder.DropColumn(
                name: "FullName",
                table: "Users");
        }
    }
    

Custom Migrations Kullanımı

  1. Entity İçinde Kullanım

    public class User
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string FullName { get; set; }
    }
    
    public class UserService
    {
        private readonly DbContext _context;
    
        public UserService(DbContext context)
        {
            _context = context;
        }
    
        public void UpdateUserFullName(int userId, string fullName)
        {
            var user = _context.Users.Find(userId);
            if (user != null)
            {
                user.FullName = fullName;
                _context.SaveChanges();
            }
        }
    }
    

  2. DbContext Konfigürasyonu

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

  3. Custom Migration Dönüşümleri

    public static class UserExtensions
    {
        public static void UpdateFullName(this User user)
        {
            user.FullName = $"{user.FirstName} {user.LastName}";
        }
    }
    

Best Practices

  1. Custom Migration Tasarımı
  2. Single Responsibility
  3. Immutability
  4. Validation
  5. Business logic

  6. Güvenlik

  7. Data integrity
  8. Rollback stratejileri
  9. Access control
  10. Audit logging

  11. Performans

  12. Batch processing
  13. Index kullanımı
  14. Transaction yönetimi
  15. Timeout yönetimi

  16. Bakım

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

Mülakat Soruları

Temel Sorular

  1. Entity Framework'te Custom Migration nedir?
  2. Cevap: Custom Migration, veritabanı şemasını özelleştirmek ve veri dönüşümlerini yönetmek için kullanılan gelişmiş bir özelliktir.

  3. Entity Framework'te Custom Migration ve Normal Migration arasındaki fark nedir?

  4. Cevap: Normal Migration'lar otomatik olarak oluşturulur, Custom Migration'lar geliştirici tarafından özelleştirilir.

  5. Entity Framework'te Custom Migration nasıl oluşturulur?

  6. Cevap: Migration sınıfı oluşturularak ve Up/Down metodları override edilerek oluşturulur.

  7. Entity Framework'te Custom Migration ne zaman kullanılır?

  8. Cevap: Veritabanı şemasını özelleştirmek, veri dönüşümlerini yönetmek veya özel işlemler yapmak için kullanılır.

  9. Entity Framework'te Custom Migration performansı nasıl etkiler?

  10. Cevap: Veritabanı işlemlerini etkileyebilir ancak veri bütünlüğünü sağlamayı kolaylaştırır.

Teknik Sorular

  1. Temel Custom Migration nasıl oluşturulur?
  2. Cevap:

    public partial class AddUserFullName : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn<string>(
                name: "FullName",
                table: "Users",
                nullable: true);
        }
    
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(
                name: "FullName",
                table: "Users");
        }
    }
    

  3. Custom Migration nasıl kullanılır?

  4. Cevap:

    public void UpdateUserFullName(int userId, string fullName)
    {
        var user = _context.Users.Find(userId);
        if (user != null)
        {
            user.FullName = fullName;
            _context.SaveChanges();
        }
    }
    

  5. Custom Migration validasyonu nasıl yapılır?

  6. Cevap:

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AddColumn<string>(
            name: "FullName",
            table: "Users",
            maxLength: 100,
            nullable: false,
            defaultValue: "");
    
        migrationBuilder.CreateIndex(
            name: "IX_Users_FullName",
            table: "Users",
            column: "FullName");
    }
    

  7. Custom Migration nasıl özelleştirilir?

  8. Cevap:

    public static class UserExtensions
    {
        public static void UpdateFullName(this User user)
        {
            user.FullName = $"{user.FirstName} {user.LastName}";
        }
    }
    

  9. Custom Migration nasıl test edilir?

  10. Cevap:
    [Test]
    public void AddUserFullName_ShouldAddFullNameColumn()
    {
        var migration = new AddUserFullName();
        var migrationBuilder = new MigrationBuilder("Test");
    
        migration.Up(migrationBuilder);
    
        Assert.IsTrue(migrationBuilder.Operations.Any(o => 
            o is AddColumnOperation operation && 
            operation.Name == "FullName"));
    }
    

İleri Seviye Sorular

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

    • Batch processing
    • Index kullanımı
    • Transaction yönetimi
    • Timeout yönetimi
    • Resource kullanımı
  3. Entity Framework'te distributed sistemlerde Custom Migration nasıl yönetilir?

  4. Cevap:

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

  6. Cevap:

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

  8. Cevap:

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

  10. Cevap:
    • Custom migration handling
    • Custom validation
    • Custom optimization
    • Custom rollback
    • Custom testing