管理端后端
This commit is contained in:
1 parent
eebc5518c5
commit
4ef6f6c90d
24 files changed
+1745
-10
No files matched your search
@@ -1,6 +1,8 @@
|
||||
using ElectionSystem.Api.Infrastructure.Auditing;
|
||||
using ElectionSystem.Api.Modules.Identity.Domain;
|
||||
using ElectionSystem.Api.Modules.Organization.Domain;
|
||||
using ElectionSystem.Api.Modules.Voters.Domain;
|
||||
using ElectionSystem.Api.Modules.Candidates.Domain;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace ElectionSystem.Api.Infrastructure.Persistence;
|
||||
@@ -9,6 +11,12 @@ public sealed class ElectionDbContext(DbContextOptions<ElectionDbContext> option
|
||||
{
|
||||
public DbSet<ApplicationUser> Users => Set<ApplicationUser>();
|
||||
public DbSet<OrganizationUnit> OrganizationUnits => Set<OrganizationUnit>();
|
||||
public DbSet<AdministrativeRegion> AdministrativeRegions => Set<AdministrativeRegion>();
|
||||
public DbSet<UserRegionalRoleAssignment> UserRegionalRoleAssignments => Set<UserRegionalRoleAssignment>();
|
||||
public DbSet<CountingStation> CountingStations => Set<CountingStation>();
|
||||
public DbSet<UserCountingStationAssignment> UserCountingStationAssignments => Set<UserCountingStationAssignment>();
|
||||
public DbSet<VoterProfile> Voters => Set<VoterProfile>();
|
||||
public DbSet<CandidateProfile> Candidates => Set<CandidateProfile>();
|
||||
public DbSet<AuditEntry> AuditEntries => Set<AuditEntry>();
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
@@ -18,7 +26,64 @@ public sealed class ElectionDbContext(DbContextOptions<ElectionDbContext> option
|
||||
entity.ToTable("identity_users");
|
||||
entity.Property(x => x.UserName).HasMaxLength(128).IsRequired();
|
||||
entity.Property(x => x.DisplayName).HasMaxLength(128).IsRequired();
|
||||
entity.Property(x => x.ExternalSubject).HasMaxLength(256);
|
||||
entity.HasIndex(x => x.UserName).IsUnique();
|
||||
entity.HasIndex(x => x.ExternalSubject).IsUnique();
|
||||
});
|
||||
modelBuilder.Entity<AdministrativeRegion>(entity =>
|
||||
{
|
||||
entity.ToTable("administrative_regions");
|
||||
entity.Property(x => x.Code).HasMaxLength(32).IsRequired();
|
||||
entity.Property(x => x.Name).HasMaxLength(200).IsRequired();
|
||||
entity.Property(x => x.Source).HasMaxLength(128).IsRequired();
|
||||
entity.Property(x => x.SourceVersion).HasMaxLength(64).IsRequired();
|
||||
entity.HasIndex(x => new { x.Code, x.SourceVersion }).IsUnique();
|
||||
entity.HasIndex(x => new { x.ParentId, x.Level, x.IsActive });
|
||||
entity.HasOne<AdministrativeRegion>().WithMany().HasForeignKey(x => x.ParentId).OnDelete(DeleteBehavior.Restrict);
|
||||
});
|
||||
modelBuilder.Entity<UserRegionalRoleAssignment>(entity =>
|
||||
{
|
||||
entity.ToTable("identity_user_regional_roles");
|
||||
entity.HasIndex(x => new { x.UserId, x.Role, x.RegionId }).IsUnique();
|
||||
entity.HasOne<ApplicationUser>().WithMany().HasForeignKey(x => x.UserId).OnDelete(DeleteBehavior.Cascade);
|
||||
entity.HasOne<AdministrativeRegion>().WithMany().HasForeignKey(x => x.RegionId).OnDelete(DeleteBehavior.Restrict);
|
||||
});
|
||||
modelBuilder.Entity<CountingStation>(entity =>
|
||||
{
|
||||
entity.ToTable("counting_stations");
|
||||
entity.Property(x => x.Name).HasMaxLength(200).IsRequired();
|
||||
entity.Property(x => x.Code).HasMaxLength(64).IsRequired();
|
||||
entity.HasIndex(x => x.Code).IsUnique();
|
||||
entity.HasIndex(x => x.RegionId);
|
||||
entity.HasOne<AdministrativeRegion>().WithMany().HasForeignKey(x => x.RegionId).OnDelete(DeleteBehavior.Restrict);
|
||||
});
|
||||
modelBuilder.Entity<UserCountingStationAssignment>(entity =>
|
||||
{
|
||||
entity.ToTable("identity_user_counting_stations");
|
||||
entity.HasIndex(x => new { x.UserId, x.CountingStationId }).IsUnique();
|
||||
entity.HasOne<ApplicationUser>().WithMany().HasForeignKey(x => x.UserId).OnDelete(DeleteBehavior.Cascade);
|
||||
entity.HasOne<CountingStation>().WithMany().HasForeignKey(x => x.CountingStationId).OnDelete(DeleteBehavior.Cascade);
|
||||
});
|
||||
modelBuilder.Entity<VoterProfile>(entity =>
|
||||
{
|
||||
entity.ToTable("voter_profiles");
|
||||
entity.Property(x => x.VoterNumber).HasMaxLength(64).IsRequired();
|
||||
entity.Property(x => x.DisplayName).HasMaxLength(128).IsRequired();
|
||||
entity.Property(x => x.DisabledReason).HasMaxLength(500);
|
||||
entity.HasIndex(x => x.VoterNumber).IsUnique();
|
||||
entity.HasIndex(x => new { x.RegionId, x.Status, x.DisplayName });
|
||||
entity.HasIndex(x => x.UserId).IsUnique();
|
||||
entity.HasOne<AdministrativeRegion>().WithMany().HasForeignKey(x => x.RegionId).OnDelete(DeleteBehavior.Restrict);
|
||||
entity.HasOne<ApplicationUser>().WithMany().HasForeignKey(x => x.UserId).OnDelete(DeleteBehavior.Restrict);
|
||||
});
|
||||
modelBuilder.Entity<CandidateProfile>(entity =>
|
||||
{
|
||||
entity.ToTable("candidate_profiles");
|
||||
entity.Property(x => x.DisplayName).HasMaxLength(128).IsRequired();
|
||||
entity.Property(x => x.NominationSummary).HasMaxLength(4000);
|
||||
entity.Property(x => x.StatusReason).HasMaxLength(500);
|
||||
entity.HasIndex(x => new { x.RegionId, x.Status, x.DisplayName });
|
||||
entity.HasOne<AdministrativeRegion>().WithMany().HasForeignKey(x => x.RegionId).OnDelete(DeleteBehavior.Restrict);
|
||||
});
|
||||
modelBuilder.Entity<OrganizationUnit>(entity =>
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user