using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; namespace AuthHex { public class AppDBContext : DbContext { public AppDBContext(DbContextOptions options) : base(options) { } public DbSet Users => Set(); public DbSet Roles => Set(); public DbSet UserType => Set(); public DbSet UserSessions => Set(); public DbSet Token => Set(); public DbSet AuthEventLogs => Set(); public DbSet UserMfas => Set(); public DbSet UserProviders => Set(); public DbSet Recovery => Set(); public DbSet SysConfigs => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Configure UserSession primary key modelBuilder.Entity() .HasKey(us => us.SessionId); // Configure relationship between UserSession and User modelBuilder.Entity() .HasOne(us => us.User) .WithMany(u => u.Sessions) .HasForeignKey(us => us.UserId) .OnDelete(DeleteBehavior.Cascade); // Configure AuthEventLog primary key modelBuilder.Entity() .HasKey(ae => ae.Id); // Configure Token primary key and relationships modelBuilder.Entity() .HasKey(t => t.TokenId); modelBuilder.Entity() .HasOne(t => t.User) .WithMany() .HasForeignKey(t => t.UserId) .OnDelete(DeleteBehavior.Cascade); // Configure UserMfa primary key and relationships modelBuilder.Entity() .HasKey(um => um.UserMfaId); modelBuilder.Entity() .HasOne(um => um.User) .WithOne(u => u.UserMfa) .HasForeignKey(um => um.UserId) .OnDelete(DeleteBehavior.Cascade); // Configure UserProvider primary key and relationships modelBuilder.Entity() .HasKey(up => up.ProviderId); modelBuilder.Entity() .HasOne(up => up.User) .WithMany(u => u.Providers) .HasForeignKey(up => up.UserId) .OnDelete(DeleteBehavior.Cascade); // Configure Role primary key modelBuilder.Entity() .HasKey(r => r.RoleId); // Configure UserType primary key modelBuilder.Entity() .HasKey(ut => ut.UserTypeId); // Configure User primary key and relationships modelBuilder.Entity() .HasKey(u => u.Id); modelBuilder.Entity() .HasOne(u => u.Role) .WithMany() .HasForeignKey(u => u.RoleId) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(u => u.UserType) .WithMany() .HasForeignKey(u => u.UserTypeId) .OnDelete(DeleteBehavior.Restrict); } } public class ApplicationDbContextFactory : IDesignTimeDbContextFactory { public AppDBContext CreateDbContext(string[] args) { var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false) .Build(); var optionsBuilder = new DbContextOptionsBuilder(); var connectionString = config.GetConnectionString("DefaultConnection"); // Pomelo MySQL provider optionsBuilder.UseMySql(connectionString, new MySqlServerVersion(new Version(8, 0, 21))); return new AppDBContext(optionsBuilder.Options); } } }