优化考试排考
This commit is contained in:
@@ -61,6 +61,11 @@ public sealed class AppDbContext(DbContextOptions<AppDbContext> options)
|
||||
public DbSet<ExamSession> ExamSessions => Set<ExamSession>();
|
||||
public DbSet<ExamSessionInvigilator> ExamSessionInvigilators =>
|
||||
Set<ExamSessionInvigilator>();
|
||||
public DbSet<ExamRoomAssignment> ExamRooms => Set<ExamRoomAssignment>();
|
||||
public DbSet<ExamRoomSession> ExamRoomSessions => Set<ExamRoomSession>();
|
||||
public DbSet<ExamSeatAssignment> ExamSeats => Set<ExamSeatAssignment>();
|
||||
public DbSet<ExamRoomInvigilator> ExamRoomInvigilators =>
|
||||
Set<ExamRoomInvigilator>();
|
||||
public DbSet<MakeupExamPlan> MakeupExamPlans => Set<MakeupExamPlan>();
|
||||
public DbSet<MakeupExamSession> MakeupExamSessions => Set<MakeupExamSession>();
|
||||
public DbSet<MakeupExamSessionInvigilator> MakeupExamSessionInvigilators =>
|
||||
@@ -719,6 +724,65 @@ public sealed class AppDbContext(DbContextOptions<AppDbContext> options)
|
||||
entity.HasOne(x => x.Teacher).WithMany()
|
||||
.HasForeignKey(x => x.TeacherId).OnDelete(DeleteBehavior.Restrict);
|
||||
});
|
||||
builder.Entity<ExamRoomAssignment>(entity =>
|
||||
{
|
||||
entity.ToTable("ExamRooms");
|
||||
entity.HasIndex(x => new { x.ExamPlanId, x.StartsAt })
|
||||
.HasDatabaseName("IX_ExamRooms_Plan_Time");
|
||||
entity.HasIndex(x => new
|
||||
{
|
||||
x.ExamPlanId,
|
||||
x.ClassroomId,
|
||||
x.StartsAt
|
||||
})
|
||||
.HasDatabaseName("IX_ExamRooms_Plan_Room_Time");
|
||||
entity.HasIndex(x => x.CourseId)
|
||||
.HasDatabaseName("IX_ExamRooms_CourseId");
|
||||
entity.HasOne(x => x.ExamPlan).WithMany(x => x.Rooms)
|
||||
.HasForeignKey(x => x.ExamPlanId).OnDelete(DeleteBehavior.Cascade);
|
||||
entity.HasOne(x => x.Course).WithMany()
|
||||
.HasForeignKey(x => x.CourseId).OnDelete(DeleteBehavior.Restrict);
|
||||
entity.HasOne(x => x.Classroom).WithMany()
|
||||
.HasForeignKey(x => x.ClassroomId).OnDelete(DeleteBehavior.Restrict);
|
||||
});
|
||||
builder.Entity<ExamRoomSession>(entity =>
|
||||
{
|
||||
entity.ToTable("ExamRoomSessions");
|
||||
entity.HasKey(x => new { x.ExamRoomId, x.ExamSessionId });
|
||||
entity.HasIndex(x => x.ExamSessionId)
|
||||
.HasDatabaseName("IX_ExamRoomSessions_SessionId");
|
||||
entity.HasOne(x => x.ExamRoom).WithMany(x => x.SessionLinks)
|
||||
.HasForeignKey(x => x.ExamRoomId).OnDelete(DeleteBehavior.Cascade);
|
||||
entity.HasOne(x => x.ExamSession).WithMany(x => x.RoomLinks)
|
||||
.HasForeignKey(x => x.ExamSessionId).OnDelete(DeleteBehavior.Restrict);
|
||||
});
|
||||
builder.Entity<ExamSeatAssignment>(entity =>
|
||||
{
|
||||
entity.ToTable("ExamSeats");
|
||||
entity.HasKey(x => new { x.ExamRoomId, x.StudentId });
|
||||
entity.HasIndex(x => new { x.ExamSessionId, x.StudentId })
|
||||
.IsUnique()
|
||||
.HasDatabaseName("UX_ExamSeats_Session_Student");
|
||||
entity.HasIndex(x => x.StudentId)
|
||||
.HasDatabaseName("IX_ExamSeats_StudentId");
|
||||
entity.HasOne(x => x.ExamRoom).WithMany(x => x.Seats)
|
||||
.HasForeignKey(x => x.ExamRoomId).OnDelete(DeleteBehavior.Cascade);
|
||||
entity.HasOne(x => x.ExamSession).WithMany(x => x.SeatAssignments)
|
||||
.HasForeignKey(x => x.ExamSessionId).OnDelete(DeleteBehavior.Restrict);
|
||||
entity.HasOne(x => x.Student).WithMany()
|
||||
.HasForeignKey(x => x.StudentId).OnDelete(DeleteBehavior.Restrict);
|
||||
});
|
||||
builder.Entity<ExamRoomInvigilator>(entity =>
|
||||
{
|
||||
entity.ToTable("ExamRoomInvigilators");
|
||||
entity.HasKey(x => new { x.ExamRoomId, x.TeacherId });
|
||||
entity.HasIndex(x => x.TeacherId)
|
||||
.HasDatabaseName("IX_ExamRoomInvigilators_TeacherId");
|
||||
entity.HasOne(x => x.ExamRoom).WithMany(x => x.Invigilators)
|
||||
.HasForeignKey(x => x.ExamRoomId).OnDelete(DeleteBehavior.Cascade);
|
||||
entity.HasOne(x => x.Teacher).WithMany()
|
||||
.HasForeignKey(x => x.TeacherId).OnDelete(DeleteBehavior.Restrict);
|
||||
});
|
||||
builder.Entity<MakeupExamPlan>(entity =>
|
||||
{
|
||||
entity.Property(x => x.Name).HasMaxLength(120);
|
||||
|
||||
@@ -64,6 +64,8 @@ public sealed class DevelopmentSqliteMigrator(
|
||||
"20260727_34_course_adjustment_occurrences";
|
||||
private const string AcademicPlanningPrerequisitesMigration =
|
||||
"20260727_35_academic_planning_prerequisites";
|
||||
private const string ExamRoomMixingMigration =
|
||||
"20260727_36_exam_room_mixing";
|
||||
|
||||
public async Task MigrateAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
@@ -468,6 +470,19 @@ public sealed class DevelopmentSqliteMigrator(
|
||||
AcademicPlanningPrerequisitesMigration,
|
||||
coursePrerequisitesExist ? [] : AcademicPlanningPrerequisiteStatements,
|
||||
cancellationToken);
|
||||
|
||||
var examRoomsExist = await db.Database
|
||||
.SqlQueryRaw<int>(
|
||||
"""
|
||||
SELECT COUNT(*) AS "Value"
|
||||
FROM sqlite_master
|
||||
WHERE type = 'table' AND name = 'ExamRooms'
|
||||
""")
|
||||
.AnyAsync(value => value > 0, cancellationToken);
|
||||
await ApplyMigrationAsync(
|
||||
ExamRoomMixingMigration,
|
||||
examRoomsExist ? [] : ExamRoomMixingStatements,
|
||||
cancellationToken);
|
||||
}
|
||||
|
||||
private async Task ApplyMigrationAsync(
|
||||
@@ -2132,4 +2147,112 @@ public sealed class DevelopmentSqliteMigrator(
|
||||
ON "CoursePrerequisites" ("PrerequisiteCourseId");
|
||||
"""
|
||||
];
|
||||
|
||||
private static readonly string[] ExamRoomMixingStatements =
|
||||
[
|
||||
"""
|
||||
CREATE TABLE "ExamRooms" (
|
||||
"Id" TEXT NOT NULL CONSTRAINT "PK_ExamRooms" PRIMARY KEY,
|
||||
"ExamPlanId" TEXT NOT NULL,
|
||||
"CourseId" TEXT NOT NULL,
|
||||
"ClassroomId" TEXT NOT NULL,
|
||||
"ExamDate" TEXT NOT NULL,
|
||||
"StartPeriod" INTEGER NOT NULL,
|
||||
"PeriodCount" INTEGER NOT NULL,
|
||||
"StartsAt" TEXT NOT NULL,
|
||||
"EndsAt" TEXT NOT NULL,
|
||||
"RequiredInvigilatorCount" INTEGER NOT NULL,
|
||||
"CreatedAt" TEXT NOT NULL,
|
||||
"UpdatedAt" TEXT NOT NULL,
|
||||
CONSTRAINT "FK_ExamRooms_ExamPlans_ExamPlanId"
|
||||
FOREIGN KEY ("ExamPlanId") REFERENCES "ExamPlans" ("Id")
|
||||
ON DELETE CASCADE,
|
||||
CONSTRAINT "FK_ExamRooms_Courses_CourseId"
|
||||
FOREIGN KEY ("CourseId") REFERENCES "Courses" ("Id")
|
||||
ON DELETE RESTRICT,
|
||||
CONSTRAINT "FK_ExamRooms_Classrooms_ClassroomId"
|
||||
FOREIGN KEY ("ClassroomId") REFERENCES "Classrooms" ("Id")
|
||||
ON DELETE RESTRICT
|
||||
);
|
||||
""",
|
||||
"""
|
||||
CREATE INDEX "IX_ExamRooms_Plan_Time"
|
||||
ON "ExamRooms" ("ExamPlanId", "StartsAt");
|
||||
""",
|
||||
"""
|
||||
CREATE INDEX "IX_ExamRooms_Plan_Room_Time"
|
||||
ON "ExamRooms" ("ExamPlanId", "ClassroomId", "StartsAt");
|
||||
""",
|
||||
"""
|
||||
CREATE INDEX "IX_ExamRooms_CourseId"
|
||||
ON "ExamRooms" ("CourseId");
|
||||
""",
|
||||
"""
|
||||
CREATE INDEX "IX_ExamRooms_ClassroomId"
|
||||
ON "ExamRooms" ("ClassroomId");
|
||||
""",
|
||||
"""
|
||||
CREATE TABLE "ExamRoomSessions" (
|
||||
"ExamRoomId" TEXT NOT NULL,
|
||||
"ExamSessionId" TEXT NOT NULL,
|
||||
CONSTRAINT "PK_ExamRoomSessions"
|
||||
PRIMARY KEY ("ExamRoomId", "ExamSessionId"),
|
||||
CONSTRAINT "FK_ExamRoomSessions_ExamRooms_ExamRoomId"
|
||||
FOREIGN KEY ("ExamRoomId") REFERENCES "ExamRooms" ("Id")
|
||||
ON DELETE CASCADE,
|
||||
CONSTRAINT "FK_ExamRoomSessions_ExamSessions_ExamSessionId"
|
||||
FOREIGN KEY ("ExamSessionId") REFERENCES "ExamSessions" ("Id")
|
||||
ON DELETE RESTRICT
|
||||
);
|
||||
""",
|
||||
"""
|
||||
CREATE INDEX "IX_ExamRoomSessions_SessionId"
|
||||
ON "ExamRoomSessions" ("ExamSessionId");
|
||||
""",
|
||||
"""
|
||||
CREATE TABLE "ExamSeats" (
|
||||
"ExamRoomId" TEXT NOT NULL,
|
||||
"ExamSessionId" TEXT NOT NULL,
|
||||
"StudentId" TEXT NOT NULL,
|
||||
"SeatNumber" INTEGER NOT NULL,
|
||||
CONSTRAINT "PK_ExamSeats"
|
||||
PRIMARY KEY ("ExamRoomId", "StudentId"),
|
||||
CONSTRAINT "FK_ExamSeats_ExamRooms_ExamRoomId"
|
||||
FOREIGN KEY ("ExamRoomId") REFERENCES "ExamRooms" ("Id")
|
||||
ON DELETE CASCADE,
|
||||
CONSTRAINT "FK_ExamSeats_ExamSessions_ExamSessionId"
|
||||
FOREIGN KEY ("ExamSessionId") REFERENCES "ExamSessions" ("Id")
|
||||
ON DELETE RESTRICT,
|
||||
CONSTRAINT "FK_ExamSeats_Students_StudentId"
|
||||
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id")
|
||||
ON DELETE RESTRICT
|
||||
);
|
||||
""",
|
||||
"""
|
||||
CREATE UNIQUE INDEX "UX_ExamSeats_Session_Student"
|
||||
ON "ExamSeats" ("ExamSessionId", "StudentId");
|
||||
""",
|
||||
"""
|
||||
CREATE INDEX "IX_ExamSeats_StudentId"
|
||||
ON "ExamSeats" ("StudentId");
|
||||
""",
|
||||
"""
|
||||
CREATE TABLE "ExamRoomInvigilators" (
|
||||
"ExamRoomId" TEXT NOT NULL,
|
||||
"TeacherId" TEXT NOT NULL,
|
||||
CONSTRAINT "PK_ExamRoomInvigilators"
|
||||
PRIMARY KEY ("ExamRoomId", "TeacherId"),
|
||||
CONSTRAINT "FK_ExamRoomInvigilators_ExamRooms_ExamRoomId"
|
||||
FOREIGN KEY ("ExamRoomId") REFERENCES "ExamRooms" ("Id")
|
||||
ON DELETE CASCADE,
|
||||
CONSTRAINT "FK_ExamRoomInvigilators_Teachers_TeacherId"
|
||||
FOREIGN KEY ("TeacherId") REFERENCES "Teachers" ("Id")
|
||||
ON DELETE RESTRICT
|
||||
);
|
||||
""",
|
||||
"""
|
||||
CREATE INDEX "IX_ExamRoomInvigilators_TeacherId"
|
||||
ON "ExamRoomInvigilators" ("TeacherId");
|
||||
"""
|
||||
];
|
||||
}
|
||||
|
||||
src/Jiaowu.Api/Infrastructure/Persistence/Migrations/MySql/20260727105716_ExamRoomMixing.Designer.cs
Generated
+5139
File diff suppressed because it is too large
Load Diff
+196
@@ -0,0 +1,196 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Jiaowu.Api.Infrastructure.Persistence.Migrations.MySql
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class ExamRoomMixing : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "ExamRooms",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(type: "char(36)", nullable: false),
|
||||
ExamPlanId = table.Column<Guid>(type: "char(36)", nullable: false),
|
||||
CourseId = table.Column<Guid>(type: "char(36)", nullable: false),
|
||||
ClassroomId = table.Column<Guid>(type: "char(36)", nullable: false),
|
||||
ExamDate = table.Column<DateTime>(type: "date", nullable: false),
|
||||
StartPeriod = table.Column<int>(type: "int", nullable: false),
|
||||
PeriodCount = table.Column<int>(type: "int", nullable: false),
|
||||
StartsAt = table.Column<DateTime>(type: "datetime(6)", nullable: false),
|
||||
EndsAt = table.Column<DateTime>(type: "datetime(6)", nullable: false),
|
||||
RequiredInvigilatorCount = table.Column<int>(type: "int", nullable: false),
|
||||
CreatedAt = table.Column<DateTime>(type: "datetime(6)", nullable: false),
|
||||
UpdatedAt = table.Column<DateTime>(type: "datetime(6)", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_ExamRooms", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_ExamRooms_Classrooms_ClassroomId",
|
||||
column: x => x.ClassroomId,
|
||||
principalTable: "Classrooms",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
table.ForeignKey(
|
||||
name: "FK_ExamRooms_Courses_CourseId",
|
||||
column: x => x.CourseId,
|
||||
principalTable: "Courses",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
table.ForeignKey(
|
||||
name: "FK_ExamRooms_ExamPlans_ExamPlanId",
|
||||
column: x => x.ExamPlanId,
|
||||
principalTable: "ExamPlans",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
})
|
||||
.Annotation("MySQL:Charset", "utf8mb4");
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "ExamRoomInvigilators",
|
||||
columns: table => new
|
||||
{
|
||||
ExamRoomId = table.Column<Guid>(type: "char(36)", nullable: false),
|
||||
TeacherId = table.Column<Guid>(type: "char(36)", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_ExamRoomInvigilators", x => new { x.ExamRoomId, x.TeacherId });
|
||||
table.ForeignKey(
|
||||
name: "FK_ExamRoomInvigilators_ExamRooms_ExamRoomId",
|
||||
column: x => x.ExamRoomId,
|
||||
principalTable: "ExamRooms",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_ExamRoomInvigilators_Teachers_TeacherId",
|
||||
column: x => x.TeacherId,
|
||||
principalTable: "Teachers",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
})
|
||||
.Annotation("MySQL:Charset", "utf8mb4");
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "ExamRoomSessions",
|
||||
columns: table => new
|
||||
{
|
||||
ExamRoomId = table.Column<Guid>(type: "char(36)", nullable: false),
|
||||
ExamSessionId = table.Column<Guid>(type: "char(36)", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_ExamRoomSessions", x => new { x.ExamRoomId, x.ExamSessionId });
|
||||
table.ForeignKey(
|
||||
name: "FK_ExamRoomSessions_ExamRooms_ExamRoomId",
|
||||
column: x => x.ExamRoomId,
|
||||
principalTable: "ExamRooms",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_ExamRoomSessions_ExamSessions_ExamSessionId",
|
||||
column: x => x.ExamSessionId,
|
||||
principalTable: "ExamSessions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
})
|
||||
.Annotation("MySQL:Charset", "utf8mb4");
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "ExamSeats",
|
||||
columns: table => new
|
||||
{
|
||||
ExamRoomId = table.Column<Guid>(type: "char(36)", nullable: false),
|
||||
StudentId = table.Column<Guid>(type: "char(36)", nullable: false),
|
||||
ExamSessionId = table.Column<Guid>(type: "char(36)", nullable: false),
|
||||
SeatNumber = table.Column<int>(type: "int", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_ExamSeats", x => new { x.ExamRoomId, x.StudentId });
|
||||
table.ForeignKey(
|
||||
name: "FK_ExamSeats_ExamRooms_ExamRoomId",
|
||||
column: x => x.ExamRoomId,
|
||||
principalTable: "ExamRooms",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_ExamSeats_ExamSessions_ExamSessionId",
|
||||
column: x => x.ExamSessionId,
|
||||
principalTable: "ExamSessions",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
table.ForeignKey(
|
||||
name: "FK_ExamSeats_Students_StudentId",
|
||||
column: x => x.StudentId,
|
||||
principalTable: "Students",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Restrict);
|
||||
})
|
||||
.Annotation("MySQL:Charset", "utf8mb4");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_ExamRoomInvigilators_TeacherId",
|
||||
table: "ExamRoomInvigilators",
|
||||
column: "TeacherId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_ExamRooms_ClassroomId",
|
||||
table: "ExamRooms",
|
||||
column: "ClassroomId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_ExamRooms_CourseId",
|
||||
table: "ExamRooms",
|
||||
column: "CourseId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_ExamRooms_Plan_Room_Time",
|
||||
table: "ExamRooms",
|
||||
columns: new[] { "ExamPlanId", "ClassroomId", "StartsAt" });
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_ExamRooms_Plan_Time",
|
||||
table: "ExamRooms",
|
||||
columns: new[] { "ExamPlanId", "StartsAt" });
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_ExamRoomSessions_SessionId",
|
||||
table: "ExamRoomSessions",
|
||||
column: "ExamSessionId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_ExamSeats_StudentId",
|
||||
table: "ExamSeats",
|
||||
column: "StudentId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "UX_ExamSeats_Session_Student",
|
||||
table: "ExamSeats",
|
||||
columns: new[] { "ExamSessionId", "StudentId" },
|
||||
unique: true);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "ExamRoomInvigilators");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "ExamRoomSessions");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "ExamSeats");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "ExamRooms");
|
||||
}
|
||||
}
|
||||
}
|
||||
+220
@@ -1558,6 +1558,119 @@ namespace Jiaowu.Api.Infrastructure.Persistence.Migrations.MySql
|
||||
b.ToTable("ExamPlans");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamRoomAssignment", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<Guid>("ClassroomId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<Guid>("CourseId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("datetime(6)");
|
||||
|
||||
b.Property<DateTime>("EndsAt")
|
||||
.HasColumnType("datetime(6)");
|
||||
|
||||
b.Property<DateTime>("ExamDate")
|
||||
.HasColumnType("date");
|
||||
|
||||
b.Property<Guid>("ExamPlanId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<int>("PeriodCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("RequiredInvigilatorCount")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<int>("StartPeriod")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<DateTime>("StartsAt")
|
||||
.HasColumnType("datetime(6)");
|
||||
|
||||
b.Property<DateTime>("UpdatedAt")
|
||||
.HasColumnType("datetime(6)");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("ClassroomId");
|
||||
|
||||
b.HasIndex("CourseId")
|
||||
.HasDatabaseName("IX_ExamRooms_CourseId");
|
||||
|
||||
b.HasIndex("ExamPlanId", "StartsAt")
|
||||
.HasDatabaseName("IX_ExamRooms_Plan_Time");
|
||||
|
||||
b.HasIndex("ExamPlanId", "ClassroomId", "StartsAt")
|
||||
.HasDatabaseName("IX_ExamRooms_Plan_Room_Time");
|
||||
|
||||
b.ToTable("ExamRooms", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamRoomInvigilator", b =>
|
||||
{
|
||||
b.Property<Guid>("ExamRoomId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<Guid>("TeacherId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.HasKey("ExamRoomId", "TeacherId");
|
||||
|
||||
b.HasIndex("TeacherId")
|
||||
.HasDatabaseName("IX_ExamRoomInvigilators_TeacherId");
|
||||
|
||||
b.ToTable("ExamRoomInvigilators", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamRoomSession", b =>
|
||||
{
|
||||
b.Property<Guid>("ExamRoomId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<Guid>("ExamSessionId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.HasKey("ExamRoomId", "ExamSessionId");
|
||||
|
||||
b.HasIndex("ExamSessionId")
|
||||
.HasDatabaseName("IX_ExamRoomSessions_SessionId");
|
||||
|
||||
b.ToTable("ExamRoomSessions", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamSeatAssignment", b =>
|
||||
{
|
||||
b.Property<Guid>("ExamRoomId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<Guid>("StudentId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<Guid>("ExamSessionId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<int>("SeatNumber")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.HasKey("ExamRoomId", "StudentId");
|
||||
|
||||
b.HasIndex("StudentId")
|
||||
.HasDatabaseName("IX_ExamSeats_StudentId");
|
||||
|
||||
b.HasIndex("ExamSessionId", "StudentId")
|
||||
.IsUnique()
|
||||
.HasDatabaseName("UX_ExamSeats_Session_Student");
|
||||
|
||||
b.ToTable("ExamSeats", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamSession", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
@@ -4097,6 +4210,98 @@ namespace Jiaowu.Api.Infrastructure.Persistence.Migrations.MySql
|
||||
b.Navigation("AcademicTerm");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamRoomAssignment", b =>
|
||||
{
|
||||
b.HasOne("Jiaowu.Api.Domain.Academic.Classroom", "Classroom")
|
||||
.WithMany()
|
||||
.HasForeignKey("ClassroomId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("Jiaowu.Api.Domain.Academic.Course", "Course")
|
||||
.WithMany()
|
||||
.HasForeignKey("CourseId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("Jiaowu.Api.Domain.Academic.ExamPlan", "ExamPlan")
|
||||
.WithMany("Rooms")
|
||||
.HasForeignKey("ExamPlanId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Classroom");
|
||||
|
||||
b.Navigation("Course");
|
||||
|
||||
b.Navigation("ExamPlan");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamRoomInvigilator", b =>
|
||||
{
|
||||
b.HasOne("Jiaowu.Api.Domain.Academic.ExamRoomAssignment", "ExamRoom")
|
||||
.WithMany("Invigilators")
|
||||
.HasForeignKey("ExamRoomId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("Jiaowu.Api.Domain.Academic.Teacher", "Teacher")
|
||||
.WithMany()
|
||||
.HasForeignKey("TeacherId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("ExamRoom");
|
||||
|
||||
b.Navigation("Teacher");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamRoomSession", b =>
|
||||
{
|
||||
b.HasOne("Jiaowu.Api.Domain.Academic.ExamRoomAssignment", "ExamRoom")
|
||||
.WithMany("SessionLinks")
|
||||
.HasForeignKey("ExamRoomId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("Jiaowu.Api.Domain.Academic.ExamSession", "ExamSession")
|
||||
.WithMany("RoomLinks")
|
||||
.HasForeignKey("ExamSessionId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("ExamRoom");
|
||||
|
||||
b.Navigation("ExamSession");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamSeatAssignment", b =>
|
||||
{
|
||||
b.HasOne("Jiaowu.Api.Domain.Academic.ExamRoomAssignment", "ExamRoom")
|
||||
.WithMany("Seats")
|
||||
.HasForeignKey("ExamRoomId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("Jiaowu.Api.Domain.Academic.ExamSession", "ExamSession")
|
||||
.WithMany("SeatAssignments")
|
||||
.HasForeignKey("ExamSessionId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("Jiaowu.Api.Domain.Academic.Student", "Student")
|
||||
.WithMany()
|
||||
.HasForeignKey("StudentId")
|
||||
.OnDelete(DeleteBehavior.Restrict)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("ExamRoom");
|
||||
|
||||
b.Navigation("ExamSession");
|
||||
|
||||
b.Navigation("Student");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamSession", b =>
|
||||
{
|
||||
b.HasOne("Jiaowu.Api.Domain.Academic.Classroom", "Classroom")
|
||||
@@ -4832,12 +5037,27 @@ namespace Jiaowu.Api.Infrastructure.Persistence.Migrations.MySql
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamPlan", b =>
|
||||
{
|
||||
b.Navigation("Rooms");
|
||||
|
||||
b.Navigation("Sessions");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamRoomAssignment", b =>
|
||||
{
|
||||
b.Navigation("Invigilators");
|
||||
|
||||
b.Navigation("Seats");
|
||||
|
||||
b.Navigation("SessionLinks");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.ExamSession", b =>
|
||||
{
|
||||
b.Navigation("Invigilators");
|
||||
|
||||
b.Navigation("RoomLinks");
|
||||
|
||||
b.Navigation("SeatAssignments");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.Academic.GradeItem", b =>
|
||||
|
||||
Reference in New Issue
Block a user