using AmtScanner.Api.Models; using Microsoft.EntityFrameworkCore; namespace AmtScanner.Api.Data; public class AppDbContext : DbContext { public AppDbContext(DbContextOptions options) : base(options) { } // AMT 相关 public DbSet AmtDevices { get; set; } public DbSet AmtCredentials { get; set; } public DbSet HardwareInfos { get; set; } public DbSet MemoryModules { get; set; } public DbSet StorageDevices { get; set; } public DbSet WindowsCredentials { get; set; } public DbSet RemoteAccessTokens { get; set; } // 用户认证相关 public DbSet Users { get; set; } public DbSet Roles { get; set; } public DbSet UserRoles { get; set; } public DbSet Menus { get; set; } public DbSet RoleMenus { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 限制索引字段长度以适应 MySQL modelBuilder.Entity() .Property(d => d.IpAddress) .HasMaxLength(50); modelBuilder.Entity() .HasIndex(d => d.IpAddress) .IsUnique(); modelBuilder.Entity() .Property(c => c.Name) .HasMaxLength(200); modelBuilder.Entity() .HasIndex(c => c.Name); // HardwareInfo 配置 modelBuilder.Entity() .HasOne(h => h.Device) .WithMany() .HasForeignKey(h => h.DeviceId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasIndex(h => h.DeviceId); modelBuilder.Entity() .HasIndex(h => h.LastUpdated); // MemoryModule 配置 modelBuilder.Entity() .HasOne(m => m.HardwareInfo) .WithMany(h => h.MemoryModules) .HasForeignKey(m => m.HardwareInfoId) .OnDelete(DeleteBehavior.Cascade); // StorageDevice 配置 modelBuilder.Entity() .HasOne(s => s.HardwareInfo) .WithMany(h => h.StorageDevices) .HasForeignKey(s => s.HardwareInfoId) .OnDelete(DeleteBehavior.Cascade); // WindowsCredential 配置 modelBuilder.Entity() .Property(w => w.Name) .HasMaxLength(200); modelBuilder.Entity() .HasIndex(w => w.Name); // RemoteAccessToken 配置 modelBuilder.Entity() .Property(t => t.Token) .HasMaxLength(64); modelBuilder.Entity() .HasIndex(t => t.Token) .IsUnique(); modelBuilder.Entity() .HasOne(t => t.Device) .WithMany() .HasForeignKey(t => t.DeviceId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasOne(t => t.WindowsCredential) .WithMany() .HasForeignKey(t => t.WindowsCredentialId) .OnDelete(DeleteBehavior.SetNull); // User 配置 modelBuilder.Entity() .Property(u => u.UserName) .HasMaxLength(100); modelBuilder.Entity() .HasIndex(u => u.UserName) .IsUnique(); modelBuilder.Entity() .HasQueryFilter(u => !u.IsDeleted); // 全局过滤已删除用户 // Role 配置 modelBuilder.Entity() .Property(r => r.RoleCode) .HasMaxLength(50); modelBuilder.Entity() .HasIndex(r => r.RoleCode) .IsUnique(); // UserRole 配置(多对多) modelBuilder.Entity() .HasKey(ur => new { ur.UserId, ur.RoleId }); modelBuilder.Entity() .HasOne(ur => ur.User) .WithMany(u => u.UserRoles) .HasForeignKey(ur => ur.UserId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasOne(ur => ur.Role) .WithMany(r => r.UserRoles) .HasForeignKey(ur => ur.RoleId) .OnDelete(DeleteBehavior.Cascade); // Menu 配置 modelBuilder.Entity() .Property(m => m.Name) .HasMaxLength(100); modelBuilder.Entity() .HasIndex(m => m.Name); modelBuilder.Entity() .HasOne(m => m.Parent) .WithMany(m => m.Children) .HasForeignKey(m => m.ParentId) .OnDelete(DeleteBehavior.Restrict); // RoleMenu 配置(多对多) modelBuilder.Entity() .HasKey(rm => new { rm.RoleId, rm.MenuId }); modelBuilder.Entity() .HasOne(rm => rm.Role) .WithMany(r => r.RoleMenus) .HasForeignKey(rm => rm.RoleId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasOne(rm => rm.Menu) .WithMany(m => m.RoleMenus) .HasForeignKey(rm => rm.MenuId) .OnDelete(DeleteBehavior.Cascade); } }