using Microsoft.EntityFrameworkCore; using SlipItIn.Shared.Models; namespace SlipItIn.Server.Data; public class SlipItInDbContext : DbContext { public SlipItInDbContext(DbContextOptions options) : base(options) { } public DbSet Users { get; set; } public DbSet Phrases { get; set; } public DbSet Games { get; set; } public DbSet Players { get; set; } public DbSet PlayerCards { get; set; } public DbSet GameRounds { get; set; } public DbSet SlipChallenges { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // User modelBuilder.Entity() .HasIndex(u => u.Username).IsUnique(); modelBuilder.Entity() .HasIndex(u => u.Email).IsUnique(); // Game modelBuilder.Entity() .HasIndex(g => g.LobbyCode).IsUnique(); modelBuilder.Entity() .HasOne(g => g.Host) .WithMany() .HasForeignKey(g => g.HostId) .OnDelete(DeleteBehavior.Restrict); // Player modelBuilder.Entity() .HasOne(p => p.User) .WithMany(u => u.Players) .HasForeignKey(p => p.UserId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasOne(p => p.Game) .WithMany(g => g.Players) .HasForeignKey(p => p.GameId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasIndex(p => new { p.GameId, p.UserId }).IsUnique(); // PlayerCard modelBuilder.Entity() .HasOne(pc => pc.Player) .WithMany(p => p.Cards) .HasForeignKey(pc => pc.PlayerId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasOne(pc => pc.Phrase) .WithMany(ph => ph.PlayerCards) .HasForeignKey(pc => pc.PhraseId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(pc => pc.GameRound) .WithMany(gr => gr.ActiveCards) .HasForeignKey(pc => pc.GameRoundId) .OnDelete(DeleteBehavior.Cascade); // GameRound modelBuilder.Entity() .HasOne(gr => gr.Game) .WithMany(g => g.Rounds) .HasForeignKey(gr => gr.GameId) .OnDelete(DeleteBehavior.Cascade); // SlipChallenge modelBuilder.Entity() .HasOne(sc => sc.GameRound) .WithMany(gr => gr.Challenges) .HasForeignKey(sc => sc.GameRoundId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasOne(sc => sc.ChallengingPlayer) .WithMany() .HasForeignKey(sc => sc.ChallengingPlayerId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(sc => sc.TargetPlayer) .WithMany() .HasForeignKey(sc => sc.TargetPlayerId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(sc => sc.TargetCard) .WithMany() .HasForeignKey(sc => sc.TargetCardId) .OnDelete(DeleteBehavior.Restrict); } }