DbContext - OnModelCreating Metodu
OnModelCreating Nedir?
OnModelCreating metodu, Entity Framework Core'da veritabanı şemasını ve model konfigürasyonunu tanımlamak için kullanılır.
OnModelCreating İçinde Yazılan Şeyler
1. Entity Konfigürasyonu
modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<User>().HasKey(u => u.Id);
}
2. Fluent API ile İlişkiler Tanımlama
// One-to-Many
modelBuilder.Entity<User>()
.HasMany(u => u.Posts)
.WithOne(p => p.User)
.HasForeignKey(p => p.UserId);
// Many-to-Many
modelBuilder.Entity<Student>()
.HasMany(s => s.Courses)
.WithMany(c => c.Students)
.UsingEntity(j => j.ToTable("StudentCourses"));
3. Property Konfigürasyonu
modelBuilder.Entity<User>()
.Property(u => u.Email)
.IsRequired()
.HasMaxLength(255);
modelBuilder.Entity<User>()
.Property(u => u.CreatedAt)
.HasDefaultValueSql("GETDATE()");
4. Unique Constraints
modelBuilder.Entity<User>()
.HasIndex(u => u.Email)
.IsUnique();
5. Default Values
modelBuilder.Entity<User>()
.Property(u => u.IsActive)
.HasDefaultValue(true);
6. Shadow Properties
modelBuilder.Entity<User>()
.Property<DateTime>("CreatedAt");
7. Seed Data (İlk Veriler)
modelBuilder.Entity<Role>().HasData(
new Role { Id = 1, Name = "Admin" },
new Role { Id = 2, Name = "User" }
);
8. Computed Columns
modelBuilder.Entity<User>()
.Property(u => u.FullName)
.HasComputedColumnSql("FirstName + ' ' + LastName");
9. Cascade Delete Ayarları
modelBuilder.Entity<User>()
.HasMany(u => u.Posts)
.WithOne(p => p.User)
.OnDelete(DeleteBehavior.Cascade);
10. Discriminator (TPH - Table Per Hierarchy)
modelBuilder.Entity<Person>()
.HasDiscriminator<string>("PersonType")
.HasValue<Student>("Student")
.HasValue<Teacher>("Teacher");
Örnek Tam Implementasyon
public class ApplicationDbContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// User Entity
modelBuilder.Entity<User>()
.HasKey(u => u.Id);
modelBuilder.Entity<User>()
.Property(u => u.Email)
.IsRequired()
.HasMaxLength(255);
modelBuilder.Entity<User>()
.HasIndex(u => u.Email)
.IsUnique();
// Post Entity
modelBuilder.Entity<Post>()
.HasKey(p => p.Id);
// İlişki
modelBuilder.Entity<User>()
.HasMany(u => u.Posts)
.WithOne(p => p.User)
.HasForeignKey(p => p.UserId)
.OnDelete(DeleteBehavior.Cascade);
}
}
