using Entities.Contracts; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore; namespace TechHelper.Context.Configuration { public class SubmissionConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder 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() // <--- 重要:将枚举存储为字符串 .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` 中进行 } } }