106 lines
5.0 KiB
C#
106 lines
5.0 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)
|
|
{
|
|
// 1. 设置表名
|
|
// 将此实体映射到数据库中名为 "submission_details" 的表。
|
|
builder.ToTable("submission_details");
|
|
|
|
// 2. 设置主键
|
|
// 将 Id 属性设置为主键。
|
|
builder.HasKey(sd => sd.Id);
|
|
|
|
// 3. 配置列名、必需性、精度及其他属性
|
|
|
|
// Id 属性对应的数据库列名为 "id"。
|
|
builder.Property(sd => sd.Id)
|
|
.HasColumnName("id");
|
|
|
|
// SubmissionId 属性对应的数据库列名为 "submission_id",并设置为必需字段。
|
|
builder.Property(sd => sd.SubmissionId)
|
|
.HasColumnName("submission_id")
|
|
.IsRequired();
|
|
|
|
// StudentId 属性对应的数据库列名为 "student_id",并设置为必需字段。
|
|
// 此外键指向 User 实体,代表提交该详情的学生。
|
|
builder.Property(sd => sd.StudentId)
|
|
.HasColumnName("student_id")
|
|
.IsRequired();
|
|
|
|
// AssignmentQuestionId 属性对应的数据库列名为 "assignment_question_id",并设置为必需字段。
|
|
builder.Property(sd => sd.AssignmentQuestionId)
|
|
.HasColumnName("assignment_question_id")
|
|
.IsRequired();
|
|
|
|
// StudentAnswer 属性对应的数据库列名为 "student_answer"。
|
|
builder.Property(sd => sd.StudentAnswer)
|
|
.HasColumnName("student_answer"); // string 默认可空
|
|
|
|
// IsCorrect 属性对应的数据库列名为 "is_correct"。
|
|
builder.Property(sd => sd.IsCorrect)
|
|
.HasColumnName("is_correct"); // bool? 默认可空
|
|
|
|
// PointsAwarded 属性对应的数据库列名为 "points_awarded",并设置精度。
|
|
builder.Property(sd => sd.PointsAwarded)
|
|
.HasColumnName("points_awarded")
|
|
.HasPrecision(5, 2); // 应用 [Precision(5, 2)] 设置
|
|
|
|
// TeacherFeedback 属性对应的数据库列名为 "teacher_feedback"。
|
|
builder.Property(sd => sd.TeacherFeedback)
|
|
.HasColumnName("teacher_feedback"); // string 默认可空
|
|
|
|
// CreatedAt 属性对应的数据库列名为 "created_at",设置为必需字段,并在添加时自动生成值。
|
|
builder.Property(sd => sd.CreatedAt)
|
|
.HasColumnName("created_at")
|
|
.IsRequired()
|
|
.ValueGeneratedOnAdd(); // 在实体首次保存时自动设置值
|
|
|
|
// UpdatedAt 属性对应的数据库列名为 "updated_at",设置为必需字段,并在添加或更新时自动生成值,同时作为并发令牌。
|
|
builder.Property(sd => sd.UpdatedAt)
|
|
.HasColumnName("updated_at")
|
|
.IsRequired()
|
|
.ValueGeneratedOnAddOrUpdate() // 在实体添加或更新时自动设置值
|
|
.IsConcurrencyToken(); // 用作乐观并发控制,防止同时修改同一记录
|
|
|
|
// IsDeleted 属性对应的数据库列名为 "deleted",并设置默认值为 false。
|
|
builder.Property(sd => sd.IsDeleted)
|
|
.HasColumnName("deleted")
|
|
.HasDefaultValue(false); // 常用作软删除标记
|
|
|
|
// 4. 配置导航属性和外键关系
|
|
|
|
// ---
|
|
// 配置 SubmissionDetail 到 Submission 的关系 (多对一)
|
|
// 一个 SubmissionDetail 记录属于一个 Submission。
|
|
builder.HasOne(sd => sd.Submission) // 当前 SubmissionDetail 有一个 Submission
|
|
.WithMany(s => s.SubmissionDetails) // 那个 Submission 可以有多个 SubmissionDetail 记录
|
|
.HasForeignKey(sd => sd.SubmissionId) // 外键是 SubmissionDetail.SubmissionId
|
|
.OnDelete(DeleteBehavior.Cascade); // 当 Submission 被删除时,相关的 SubmissionDetail 记录也级联删除。
|
|
|
|
// ---
|
|
// 配置 SubmissionDetail 到 User (作为 Student) 的关系 (多对一)
|
|
// 一个 SubmissionDetail 记录与一个 User (提交该详情的学生) 相关联。
|
|
// 假设 `User` 实体中有一个名为 `SubmissionDetailsAsStudent` 的 `ICollection<SubmissionDetail>` 集合属性。
|
|
builder.HasOne(sd => sd.User) // 当前 SubmissionDetail 有一个 User (作为学生)
|
|
.WithMany(u => u.SubmissionDetails)
|
|
.HasForeignKey(sd => sd.StudentId) // 外键是 SubmissionDetail.StudentId
|
|
.OnDelete(DeleteBehavior.Restrict); // 当 User (学生) 被删除时,如果他/她还有提交详情,则会阻止删除。
|
|
// 这是一个更安全的选择,以防止意外数据丢失。
|
|
|
|
// ---
|
|
// 配置 SubmissionDetail 到 AssignmentQuestion 的关系 (多对一)
|
|
// 一个 SubmissionDetail 记录对应一个 AssignmentQuestion。
|
|
builder.HasOne(sd => sd.AssignmentQuestion) // 当前 SubmissionDetail 有一个 AssignmentQuestion
|
|
.WithMany(aq => aq.SubmissionDetails) // 那个 AssignmentQuestion 可以有多个 SubmissionDetail 记录
|
|
.HasForeignKey(sd => sd.AssignmentQuestionId) // 外键是 SubmissionDetail.AssignmentQuestionId
|
|
.OnDelete(DeleteBehavior.Cascade); // 当 AssignmentQuestion 被删除时,相关的 SubmissionDetail 记录也级联删除。
|
|
}
|
|
}
|
|
}
|