Files
TechHelper/TechHelper.Server/Context/Configuration/SubmissionDetailConfiguration.cs
2025-06-20 15:37:39 +08:00

77 lines
3.1 KiB
C#

using Entities.Contracts;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore;
namespace TechHelper.Context.Configuration
{
public class SubmissionDetailConfiguration : IEntityTypeConfiguration<SubmissionDetail>
{
public void Configure(EntityTypeBuilder<SubmissionDetail> 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.Restrict); // 当 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 记录也级联删除。
}
}
}