using Microsoft.EntityFrameworkCore; using RacePlannerApi.Models; namespace RacePlannerApi.Data; public class RacePlannerDbContext : DbContext { public RacePlannerDbContext(DbContextOptions options) : base(options) { } public DbSet Users { get; set; } public DbSet Events { get; set; } public DbSet Registrations { get; set; } public DbSet Payments { get; set; } public DbSet Announcements { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // User configurations modelBuilder.Entity(entity => { entity.HasIndex(u => u.Email).IsUnique(); entity.Property(u => u.Role).HasConversion(); }); // Event configurations modelBuilder.Entity(entity => { entity.HasIndex(e => e.EventDate); entity.HasIndex(e => e.Status); entity.HasIndex(e => e.Category); entity.Property(e => e.Status).HasConversion(); entity.Property(e => e.Tags).HasColumnType("text[]"); entity.HasOne(e => e.Organizer) .WithMany(u => u.OrganizedEvents) .HasForeignKey(e => e.OrganizerId) .OnDelete(DeleteBehavior.Restrict); }); // Registration configurations modelBuilder.Entity(entity => { entity.HasIndex(r => new { r.EventId, r.ParticipantId }).IsUnique(); entity.HasIndex(r => r.Status); entity.Property(r => r.Status).HasConversion(); entity.HasOne(r => r.Event) .WithMany(e => e.Registrations) .HasForeignKey(r => r.EventId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(r => r.Participant) .WithMany(u => u.Registrations) .HasForeignKey(r => r.ParticipantId) .OnDelete(DeleteBehavior.Restrict); }); // Payment configurations modelBuilder.Entity(entity => { entity.HasIndex(p => p.RegistrationId); entity.HasIndex(p => p.PaymentDate); entity.Property(p => p.Method).HasConversion(); entity.Property(p => p.Amount).HasPrecision(18, 2); // For decimal Amount entity.HasOne(p => p.Registration) .WithMany(r => r.Payments) .HasForeignKey(p => p.RegistrationId) .OnDelete(DeleteBehavior.Cascade); }); // Announcement configurations modelBuilder.Entity(entity => { entity.HasIndex(a => a.EventId); entity.HasIndex(a => a.CreatedAt); entity.HasOne(a => a.Event) .WithMany(e => e.Announcements) .HasForeignKey(a => a.EventId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(a => a.Author) .WithMany() .HasForeignKey(a => a.AuthorId) .OnDelete(DeleteBehavior.Restrict); }); } }