AppDbContext.cs 5.35 KB
using Microsoft.EntityFrameworkCore;
using RobotProductionSystem.Api.Domain;

namespace RobotProductionSystem.Api.Infrastructure;

public sealed class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(options)
{
    public DbSet<User> Users => Set<User>();
    public DbSet<UserRole> UserRoles => Set<UserRole>();
    public DbSet<Member> Members => Set<Member>();
    public DbSet<SettingsProfile> SettingsProfiles => Set<SettingsProfile>();
    public DbSet<SettingsNotification> SettingsNotifications => Set<SettingsNotification>();
    public DbSet<SecurityAccount> SecurityAccounts => Set<SecurityAccount>();
    public DbSet<DeviceType> DeviceTypes => Set<DeviceType>();
    public DbSet<WorkOrder> WorkOrders => Set<WorkOrder>();
    public DbSet<WorkOrderEvent> WorkOrderEvents => Set<WorkOrderEvent>();
    public DbSet<SnItem> SnItems => Set<SnItem>();
    public DbSet<SnEvent> SnEvents => Set<SnEvent>();
    public DbSet<OperationTask> OperationTasks => Set<OperationTask>();
    public DbSet<OperationTaskEvent> OperationTaskEvents => Set<OperationTaskEvent>();
    public DbSet<DashboardWorkOrderSnapshot> DashboardWorkOrderSnapshots => Set<DashboardWorkOrderSnapshot>();
    public DbSet<ShellJsonItem> ShellJsonItems => Set<ShellJsonItem>();

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>(entity =>
        {
            entity.ToTable("users");
            entity.Property(x => x.Id).ValueGeneratedNever();
            entity.HasIndex(x => x.Username).IsUnique();
            entity.HasIndex(x => x.Email).IsUnique();
            entity.Property(x => x.Username).HasMaxLength(80);
            entity.Property(x => x.PasswordHash).HasMaxLength(512);
            entity.Property(x => x.Name).HasMaxLength(160);
            entity.Property(x => x.Email).HasMaxLength(160);
            entity.Property(x => x.Station).HasMaxLength(160);
            entity.HasMany(x => x.Roles).WithOne(x => x.User).HasForeignKey(x => x.UserId).OnDelete(DeleteBehavior.Cascade);
        });

        modelBuilder.Entity<UserRole>(entity =>
        {
            entity.ToTable("user_roles");
            entity.HasIndex(x => new { x.UserId, x.Role }).IsUnique();
            entity.Property(x => x.Role).HasMaxLength(80);
        });

        modelBuilder.Entity<Member>(entity =>
        {
            entity.ToTable("members");
            entity.Property(x => x.Id).ValueGeneratedNever();
            entity.HasIndex(x => x.Username).IsUnique();
            entity.HasIndex(x => x.Email).IsUnique();
        });

        modelBuilder.Entity<SettingsProfile>().ToTable("settings_profiles");
        modelBuilder.Entity<SettingsProfile>().Property(x => x.Id).ValueGeneratedNever();
        modelBuilder.Entity<SettingsNotification>().ToTable("settings_notifications");
        modelBuilder.Entity<SettingsNotification>().Property(x => x.Id).ValueGeneratedNever();
        modelBuilder.Entity<SecurityAccount>().ToTable("security_accounts");
        modelBuilder.Entity<SecurityAccount>().Property(x => x.Id).ValueGeneratedNever();

        modelBuilder.Entity<DeviceType>(entity =>
        {
            entity.ToTable("device_types");
            entity.Property(x => x.Id).ValueGeneratedNever();
            entity.HasIndex(x => new { x.Name, x.Model }).IsUnique();
            entity.Property(x => x.WeightKg).HasPrecision(10, 2);
        });

        modelBuilder.Entity<WorkOrder>(entity =>
        {
            entity.ToTable("work_orders");
            entity.Property(x => x.Id).ValueGeneratedNever();
            entity.HasIndex(x => x.OrderNo).IsUnique();
            entity.HasMany(x => x.Events).WithOne(x => x.WorkOrder).HasForeignKey(x => x.WorkOrderId).OnDelete(DeleteBehavior.Cascade);
        });

        modelBuilder.Entity<WorkOrderEvent>(entity =>
        {
            entity.ToTable("work_order_events");
            entity.HasIndex(x => x.EventId).IsUnique();
        });

        modelBuilder.Entity<SnItem>(entity =>
        {
            entity.ToTable("sn_items");
            entity.Property(x => x.Id).ValueGeneratedNever();
            entity.HasIndex(x => x.Sn).IsUnique();
            entity.HasMany(x => x.Events).WithOne(x => x.SnItem).HasForeignKey(x => x.SnItemId).OnDelete(DeleteBehavior.Cascade);
        });

        modelBuilder.Entity<SnEvent>(entity =>
        {
            entity.ToTable("sn_events");
            entity.HasIndex(x => x.EventId).IsUnique();
        });

        modelBuilder.Entity<OperationTask>(entity =>
        {
            entity.ToTable("operation_tasks");
            entity.Property(x => x.Id).ValueGeneratedNever();
            entity.HasMany(x => x.AuditEvents).WithOne(x => x.OperationTask).HasForeignKey(x => x.OperationTaskId).OnDelete(DeleteBehavior.Cascade);
        });

        modelBuilder.Entity<OperationTaskEvent>(entity =>
        {
            entity.ToTable("operation_task_events");
            entity.HasIndex(x => x.EventId).IsUnique();
        });

        modelBuilder.Entity<DashboardWorkOrderSnapshot>().ToTable("dashboard_work_order_snapshots");
        modelBuilder.Entity<DashboardWorkOrderSnapshot>().Property(x => x.Id).ValueGeneratedNever();
        modelBuilder.Entity<ShellJsonItem>(entity =>
        {
            entity.ToTable("shell_json_items");
            entity.HasIndex(x => x.Kind).IsUnique();
            entity.Property(x => x.PayloadJson).HasColumnType("jsonb");
        });
    }
}