using Entities.Contracts; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore; namespace TechHelper.Context.Configuration { public class SubmissionDetailConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { builder.ToTable("submission_details"); builder.HasKey(sd => sd.Id); builder.Property(sd => sd.Id) .HasColumnName("id"); builder.Property(sd => sd.SubmissionId) .HasColumnName("submission_id") .IsRequired(); builder.Property(sd => sd.StudentId) .HasColumnName("student_id") .IsRequired(); builder.Property(sd => sd.AssignmentQuestionId) .HasColumnName("assignment_question_id") .IsRequired(); builder.Property(sd => sd.StudentAnswer) .HasColumnName("student_answer"); // string 默认可空 builder.Property(sd => sd.IsCorrect) .HasColumnName("is_correct"); // bool? 默认可空 builder.Property(sd => sd.PointsAwarded) .HasColumnName("points_awarded") .HasPrecision(5, 2); // 应用 [Precision(5, 2)] 设置 builder.Property(sd => sd.TeacherFeedback) .HasColumnName("teacher_feedback"); // string 默认可空 builder.Property(sd => sd.CreatedAt) .HasColumnName("created_at") .IsRequired() .ValueGeneratedOnAdd(); // 在实体首次保存时自动设置值 builder.Property(sd => sd.UpdatedAt) .HasColumnName("updated_at") .IsRequired() .ValueGeneratedOnAddOrUpdate() // 在实体添加或更新时自动设置值 .IsConcurrencyToken(); // 用作乐观并发控制,防止同时修改同一记录 builder.Property(sd => sd.IsDeleted) .HasColumnName("deleted") .HasDefaultValue(false); builder.HasOne(sd => sd.Submission) // 当前 SubmissionDetail 有一个 Submission .WithMany(s => s.SubmissionDetails) // 那个 Submission 可以有多个 SubmissionDetail 记录 .HasForeignKey(sd => sd.SubmissionId) // 外键是 SubmissionDetail.SubmissionId .OnDelete(DeleteBehavior.Cascade); // 当 Submission 被删除时,相关的 SubmissionDetail 记录也级联删除。 builder.HasOne(sd => sd.Student) // 当前 SubmissionDetail 有一个 User (作为学生) .WithMany(u => u.SubmissionDetails) .HasForeignKey(sd => sd.StudentId) // 外键是 SubmissionDetail.StudentId .OnDelete(DeleteBehavior.Cascade); // 当 User (学生) 被删除时,如果他/她还有提交详情,则会阻止删除。 // 这是一个更安全的选择,以防止意外数据丢失。 builder.HasOne(sd => sd.AssignmentQuestion) // 当前 SubmissionDetail 有一个 AssignmentQuestion .WithMany(aq => aq.SubmissionDetails) // 那个 AssignmentQuestion 可以有多个 SubmissionDetail 记录 .HasForeignKey(sd => sd.AssignmentQuestionId) // 外键是 SubmissionDetail.AssignmentQuestionId .OnDelete(DeleteBehavior.Cascade); // 当 AssignmentQuestion 被删除时,相关的 SubmissionDetail 记录也级联删除。 } } }