using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Haoliang.Data.Entities; using Haoliang.Models.System; using Pomelo.EntityFrameworkCore.MySql.Infrastructure; namespace Haoliang.Data { public class CNCBusinessDbContext : DbContext { public CNCBusinessDbContext(DbContextOptions options) : base(options) { } // Device Management public DbSet Devices { get; set; } public DbSet DeviceCurrentStatus { get; set; } public DbSet TagData { get; set; } // DeviceStatus as string property (since it's an enum) public string DeviceStatus { get; set; } = null!; // Template Management public DbSet CNCTemplates { get; set; } public DbSet TagMappings { get; set; } // Production Management public DbSet ProductionRecords { get; set; } public DbSet ProgramProductionSummary { get; set; } public DbSet ProductionSummaries { get; set; } // User Management public DbSet Users { get; set; } public DbSet Roles { get; set; } public DbSet Employees { get; set; } public DbSet UserPermissions { get; set; } public DbSet RolePermissions { get; set; } public DbSet UserSessions { get; set; } public DbSet PasswordResets { get; set; } // System Management public DbSet Alarms { get; set; } public DbSet AlarmRules { get; set; } public DbSet AlarmNotifications { get; set; } public DbSet SystemConfigs { get; set; } public DbSet LogEntries { get; set; } public DbSet StatisticRules { get; set; } public DbSet StatisticResults { get; set; } // Data Collection public DbSet CollectionTasks { get; set; } public DbSet CollectionResults { get; set; } public DbSet CollectionLogs { get; set; } public DbSet CollectionConfigs { get; set; } // Scheduled Tasks public DbSet ScheduledTasks { get; set; } public DbSet TaskExecutionResults { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Configure relationships ConfigureDeviceRelationships(modelBuilder); ConfigureUserRelationships(modelBuilder); ConfigureAlarmRelationships(modelBuilder); ConfigureCollectionRelationships(modelBuilder); ConfigureProductionRelationships(modelBuilder); ConfigureTemplateRelationships(modelBuilder); // Configure indexes ConfigureIndexes(modelBuilder); // Configure constraints ConfigureConstraints(modelBuilder); // Configure data conversions ConfigureDataConversions(modelBuilder); } private void ConfigureDeviceRelationships(ModelBuilder modelBuilder) { } private void ConfigureUserRelationships(ModelBuilder modelBuilder) { } private void ConfigureAlarmRelationships(ModelBuilder modelBuilder) { } private void ConfigureCollectionRelationships(ModelBuilder modelBuilder) { } private void ConfigureProductionRelationships(ModelBuilder modelBuilder) { } private void ConfigureTemplateRelationships(ModelBuilder modelBuilder) { } private void ConfigureIndexes(ModelBuilder modelBuilder) { // Device indexes modelBuilder.Entity() .HasIndex(d => d.DeviceCode) .IsUnique(); modelBuilder.Entity() .HasIndex(d => d.IPAddress); modelBuilder.Entity() .HasIndex(d => d.IsOnline); modelBuilder.Entity() .HasIndex(d => d.IsAvailable); // User indexes modelBuilder.Entity() .HasIndex(u => u.Username) .IsUnique(); modelBuilder.Entity() .HasIndex(u => u.Email) .IsUnique(); modelBuilder.Entity() .HasIndex(u => u.IsActive); // Alarm indexes modelBuilder.Entity() .HasIndex(a => a.IsResolved); // Collection indexes modelBuilder.Entity() .HasIndex(cr => cr.DeviceId); modelBuilder.Entity() .HasIndex(cr => cr.CollectionTime); modelBuilder.Entity() .HasIndex(cr => cr.IsSuccess); // Production indexes modelBuilder.Entity() .HasIndex(pr => pr.DeviceId); modelBuilder.Entity() .HasIndex(pr => pr.ProductionDate); modelBuilder.Entity() .HasIndex(pr => pr.IsCompleted); // Template indexes modelBuilder.Entity() .HasIndex(t => t.BrandName); // System config indexes modelBuilder.Entity() .HasIndex(sc => sc.ConfigKey) .IsUnique(); modelBuilder.Entity() .HasIndex(sc => sc.Category); modelBuilder.Entity() .HasIndex(sc => sc.IsActive); } private void ConfigureConstraints(ModelBuilder modelBuilder) { // Device constraints modelBuilder.Entity() .Property(d => d.DeviceCode) .IsRequired() .HasMaxLength(50); modelBuilder.Entity() .Property(d => d.DeviceName) .IsRequired() .HasMaxLength(100); modelBuilder.Entity() .Property(d => d.IPAddress) .IsRequired() .HasMaxLength(15); modelBuilder.Entity() .Property(d => d.HttpUrl) .IsRequired() .HasMaxLength(255); modelBuilder.Entity() .Property(d => d.CollectionInterval) .IsRequired(); // User constraints modelBuilder.Entity() .Property(u => u.Username) .IsRequired() .HasMaxLength(50); modelBuilder.Entity() .Property(u => u.Email) .IsRequired() .HasMaxLength(100); modelBuilder.Entity() .Property(u => u.PasswordHash) .IsRequired() .HasMaxLength(255); // Alarm constraints modelBuilder.Entity() .Property(a => a.AlarmType) .IsRequired() .HasMaxLength(50); // System config constraints modelBuilder.Entity() .Property(sc => sc.ConfigKey) .IsRequired() .HasMaxLength(100); modelBuilder.Entity() .Property(sc => sc.ConfigValue) .IsRequired(); modelBuilder.Entity() .Property(sc => sc.Category) .IsRequired() .HasMaxLength(50); } private void ConfigureDataConversions(ModelBuilder modelBuilder) { // Configure decimal properties with appropriate precision modelBuilder.Entity() .Property(ps => ps.QualityRate) .HasColumnType("decimal(5,2)"); modelBuilder.Entity() .Property(sc => sc.ConfigValue) .HasColumnType("text"); modelBuilder.Entity() .Property(cl => cl.LogData) .HasColumnType("text"); modelBuilder.Entity() .Property(cr => cr.RawJson) .HasColumnType("json"); modelBuilder.Entity() .Property(cr => cr.ParsedData) .HasColumnType("text"); } public static void ConfigureDatabaseServices(IServiceCollection services, IConfiguration configuration) { var connectionString = configuration.GetConnectionString("CNCBusinessDb"); services.AddDbContext(options => { options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString), mysqlOptions => { mysqlOptions.EnableRetryOnFailure( maxRetryCount: 3, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null); }); // Enable lazy loading for development if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development") { options.EnableSensitiveDataLogging(); options.EnableDetailedErrors(); } }); } } }