using Microsoft.EntityFrameworkCore; namespace sodoff.Model; public class DBContext : DbContext { public DbSet Users { get; set; } = null!; public DbSet Vikings { get; set; } = null!; public DbSet Dragons { get; set; } = null!; public DbSet Images { get; set; } = null!; public DbSet Sessions { get; set; } = null!; public DbSet Pairs { get; set; } = null!; public DbSet PairData { get; set; } = null!; public DbSet TaskStatuses { get; set; } = null!; public DbSet InventoryItems { get; set; } = null!; public DbSet MissionStates { get; set; } = null!; public DbSet Rooms { get; set; } = null!; public DbSet RoomItems { get; set; } = null!; public string DbPath { get; } public DBContext() { DbPath = Path.Join(Directory.GetCurrentDirectory(), "sodoff.db"); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseSqlite($"Data Source={DbPath}").UseLazyLoadingProxies(); protected override void OnModelCreating(ModelBuilder builder) { // Sessions builder.Entity().HasOne(s => s.User) .WithMany(e => e.Sessions) .HasForeignKey(e => e.UserId) .OnDelete(DeleteBehavior.Cascade); builder.Entity().HasOne(s => s.Viking) .WithMany(e => e.Sessions) .HasForeignKey(e => e.VikingId) .OnDelete(DeleteBehavior.Cascade); // Users builder.Entity().HasMany(u => u.Sessions) .WithOne(e => e.User); builder.Entity().HasMany(u => u.PairData) .WithOne(e => e.User); builder.Entity().HasMany(u => u.Vikings) .WithOne(e => e.User); // Vikings builder.Entity().HasOne(v => v.User) .WithMany(e => e.Vikings) .HasForeignKey(e => e.UserId); builder.Entity().HasMany(v => v.Dragons) .WithOne(e => e.Viking); builder.Entity().HasMany(v => v.Sessions) .WithOne(e => e.Viking); builder.Entity().HasMany(v => v.MissionStates) .WithOne(e => e.Viking); builder.Entity().HasMany(v => v.Rooms) .WithOne(e => e.Viking); builder.Entity().HasMany(v => v.AchievementPoints) .WithOne(e => e.Viking); builder.Entity().HasMany(v => v.PairData) .WithOne(e => e.Viking); builder.Entity().HasMany(v => v.Images) .WithOne(e => e.Viking); builder.Entity().HasMany(v => v.TaskStatuses) .WithOne(e => e.Viking); builder.Entity().HasOne(v => v.SelectedDragon) .WithOne() .HasForeignKey(e => e.SelectedDragonId); // Dragons builder.Entity().HasOne(d => d.Viking) .WithMany(e => e.Dragons) .HasForeignKey(e => e.VikingId); builder.Entity().HasMany(d => d.PairData) .WithOne(e => e.Dragon); // PairData & Pair builder.Entity().HasMany(p => p.Pairs) .WithOne(e => e.PairData); builder.Entity().HasOne(p => p.Viking) .WithMany(e => e.PairData) .HasForeignKey(e => e.VikingId) .OnDelete(DeleteBehavior.Cascade); builder.Entity().HasOne(p => p.User) .WithMany(e => e.PairData) .HasForeignKey(e => e.UserId) .OnDelete(DeleteBehavior.Cascade); builder.Entity().HasOne(p => p.Dragon) .WithMany(e => e.PairData) .HasForeignKey(e => e.DragonId) .OnDelete(DeleteBehavior.Cascade); builder.Entity() .HasOne(p => p.PairData) .WithMany(pd => pd.Pairs) .HasForeignKey(p => p.MasterId) .HasPrincipalKey(e => e.Id); // Inventory & InventoryItem builder.Entity() .HasMany(v => v.InventoryItems) .WithOne(i => i.Viking); builder.Entity() .HasOne(e => e.Viking) .WithMany(e => e.InventoryItems) .HasForeignKey(e => e.VikingId); // Room & RoomItem builder.Entity().HasOne(r => r.Viking) .WithMany(e => e.Rooms) .HasForeignKey(e => e.VikingId); builder.Entity().HasMany(r => r.Items) .WithOne(e => e.Room); builder.Entity().HasOne(i => i.Room) .WithMany(r => r.Items) .HasForeignKey(e => e.RoomId); // Others .. builder.Entity().HasOne(s => s.Viking) .WithMany(e => e.Images) .HasForeignKey(e => e.VikingId); builder.Entity().HasKey(e => new { e.Id, e.VikingId, e.MissionId }); builder.Entity() .HasOne(t => t.Viking) .WithMany(v => v.TaskStatuses) .HasForeignKey(t => t.VikingId); builder.Entity().HasOne(m => m.Viking) .WithMany(e => e.MissionStates) .HasForeignKey(e => e.VikingId); builder.Entity().HasKey(e => new { e.VikingId, e.Type }); builder.Entity() .HasOne(e => e.Viking) .WithMany(e => e.AchievementPoints) .HasForeignKey(e => e.VikingId); } }