using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Reflection.Emit; using Entities.Models; using FileEntity = Entities.Models.File; namespace Infrastructure { public class MyDbContext : DbContext { public MyDbContext(DbContextOptions options) : base(options) { } public DbSet Users { get; set; } public DbSet Orders { get; set; } public DbSet Robots { get; set; } public DbSet Nodes { get; set; } public DbSet Files { get; set; } public DbSet AdminKeys { get; set; } public DbSet Friendships { get; set; } public DbSet SystemSettings { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity() .HasMany(u => u.SentOrders) .WithOne(o => o.Sender) .HasForeignKey(o => o.SenderId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasMany(u => u.ReceivedOrders) .WithOne(o => o.Recipient) .HasForeignKey(o => o.RecipientId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(o => o.AssignedRobot) .WithMany(r => r.ActiveOrders) .HasForeignKey(o => o.RobotId) .IsRequired(false) .OnDelete(DeleteBehavior.SetNull); modelBuilder.Entity() .HasOne(o => o.PickupNode) .WithMany() .HasForeignKey(o => o.PickupNodeId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(o => o.DropoffNode) .WithMany() .HasForeignKey(o => o.DropoffNodeId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(r => r.CurrentNode) .WithMany() .HasForeignKey(r => r.CurrentNodeId) .IsRequired(false) .OnDelete(DeleteBehavior.SetNull); modelBuilder.Entity() .HasOne(r => r.TargetNode) .WithMany() .HasForeignKey(r => r.TargetNodeId) .IsRequired(false) .OnDelete(DeleteBehavior.SetNull); // Add unique constraint for robot serial number modelBuilder.Entity() .HasIndex(r => r.SerialNumber) .IsUnique(); // User's personal node relationship modelBuilder.Entity() .HasOne(u => u.PersonalNode) .WithMany() .HasForeignKey(u => u.PersonalNodeId) .IsRequired(false) .OnDelete(DeleteBehavior.SetNull); // File relationships modelBuilder.Entity() .HasOne(f => f.Order) .WithMany(o => o.Images) .HasForeignKey(f => f.OrderId) .IsRequired(false) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasOne(f => f.User) .WithOne(u => u.ProfilePhoto) .HasForeignKey(u => u.ProfilePhotoId) .IsRequired(false) .OnDelete(DeleteBehavior.SetNull); // AdminKey relationships modelBuilder.Entity() .HasOne(ak => ak.UsedByUser) .WithMany() .HasForeignKey(ak => ak.UsedByUserId) .IsRequired(false) .OnDelete(DeleteBehavior.SetNull); modelBuilder.Entity() .HasOne(ak => ak.CreatedByAdmin) .WithMany() .HasForeignKey(ak => ak.CreatedByAdminId) .OnDelete(DeleteBehavior.Restrict); // Add unique index for KeyCode modelBuilder.Entity() .HasIndex(ak => ak.KeyCode) .IsUnique(); // Friendship relationships modelBuilder.Entity() .HasOne(f => f.User) .WithMany(u => u.SentFriendRequests) .HasForeignKey(f => f.UserId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(f => f.Friend) .WithMany(u => u.ReceivedFriendRequests) .HasForeignKey(f => f.FriendId) .OnDelete(DeleteBehavior.Restrict); // Prevent duplicate requests between the same users modelBuilder.Entity() .HasIndex(f => new { f.UserId, f.FriendId }) .IsUnique(); } } }