Files
TechHelper/TechHelper.Server/Context/Configuration/SubmissionConfiguration.cs
2025-05-23 19:03:00 +08:00

110 lines
4.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Entities.Contracts;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore;
namespace TechHelper.Context.Configuration
{
public class SubmissionConfiguration : IEntityTypeConfiguration<Submission>
{
public void Configure(EntityTypeBuilder<Submission> builder)
{
// 1. 设置表名
builder.ToTable("submissions");
// 2. 设置主键
builder.HasKey(s => s.Id);
// 3. 配置列名、必需性、精度及其他属性
// Id
builder.Property(s => s.Id)
.HasColumnName("id");
// AssignmentId
builder.Property(s => s.AssignmentId)
.HasColumnName("assignment_id")
.IsRequired();
// StudentId
builder.Property(s => s.StudentId)
.HasColumnName("student_id")
.IsRequired();
// AttemptNumber
// 注意:如果 AttemptNumber 应该是一个递增的数字Guid 可能不是最合适的类型。
// 但根据你的定义,这里按 Guid 类型配置。
builder.Property(s => s.AttemptNumber)
.HasColumnName("attempt_number")
.IsRequired();
// SubmissionTime
builder.Property(s => s.SubmissionTime)
.HasColumnName("submission_time"); // 没有 [Required] 属性,所以可以是可空的
// OverallGrade
builder.Property(s => s.OverallGrade)
.HasColumnName("overall_grade")
.HasPrecision(5, 2); // 应用精度设置
// OverallFeedback
builder.Property(s => s.OverallFeedback)
.HasColumnName("overall_feedback");
// GradedBy (现为 Guid? 类型)
builder.Property(s => s.GradedBy)
.HasColumnName("graded_by"); // 作为可空外键,不需要 IsRequired()
// GradedAt
builder.Property(s => s.GradedAt)
.HasColumnName("graded_at");
// IsDeleted
builder.Property(s => s.IsDeleted)
.HasColumnName("deleted")
.HasDefaultValue(false);
// Status (枚举作为字符串存储)
builder.Property(s => s.Status)
.HasColumnName("status")
.IsRequired()
.HasConversion<string>() // <--- 重要:将枚举存储为字符串
.HasMaxLength(15); // <--- 应用最大长度
// 4. 配置导航属性和外键关系
// ---
// 配置 Submission 到 Assignment 的关系 (多对一)
// 一个 Submission 属于一个 Assignment。
builder.HasOne(s => s.Assignment) // 当前 Submission 有一个 Assignment
.WithMany(a => a.Submissions) // 那个 Assignment 可以有多个 Submission
.HasForeignKey(s => s.AssignmentId) // 外键是 Submission.AssignmentId
.OnDelete(DeleteBehavior.Cascade); // 当 Assignment 被删除时,相关的 Submission 也级联删除。
// ---
// 配置 Submission 到 User (Student) 的关系 (多对一)
// 一个 Submission 由一个 User (Student) 提交。
builder.HasOne(s => s.Student) // 当前 Submission 有一个 Student (User)
.WithMany(u => u.SubmissionsAsStudent) // 那个 User (Student) 可以有多个 Submission
.HasForeignKey(s => s.StudentId) // 外键是 Submission.StudentId
.OnDelete(DeleteBehavior.Restrict); // 当 User (Student) 被删除时,如果还有其提交的 Submission则会阻止删除。
// ---
// 配置 Submission 到 User (Grader) 的关系 (多对一)
// 一个 Submission 可以由一个 User (Grader) 批改 (可选)。
builder.HasOne(s => s.Grader) // 当前 Submission 有一个 Grader (User),可以是空的
.WithMany(u => u.GradedSubmissions) // 那个 User (Grader) 可以批改多个 Submission
.HasForeignKey(s => s.GradedBy) // 外键是 Submission.GradedBy
.OnDelete(DeleteBehavior.SetNull); // 当 User (Grader) 被删除时,如果 GradedBy 是可空的,则将其设置为 NULL。
// 如果 GradedBy 是不可空的,需要改为 Restrict 或 Cascade。
// ---
// 配置 Submission 到 SubmissionDetail 的关系 (一对多)
// 一个 Submission 可以有多个 SubmissionDetail。
// 这个关系的外键配置通常在 "多" 的一方 (`SubmissionDetail` 实体) 进行。
builder.HasMany(s => s.SubmissionDetails) // 当前 Submission 有多个 SubmissionDetail
.WithOne(sd => sd.Submission); // 每一个 SubmissionDetail 都有一个 Submission
// .HasForeignKey(sd => sd.SubmissionId); // 外键的配置应在 `SubmissionDetailConfiguration` 中进行
}
}
}