using Entities.Contracts; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore; namespace TechHelper.Context.Configuration { public class AssignmentQuestionConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { // 1. 设置表名 builder.ToTable("assignment_questions"); // 2. 设置主键 builder.HasKey(aq => aq.Id); // 3. 配置列名、必需性及其他属性 // 配置 Id 列 builder.Property(aq => aq.Id) .HasColumnName("id"); // 配置 QuestionId 列 (已修正拼写) builder.Property(aq => aq.QuestionId) .HasColumnName("question_id"); builder.Property(aq => aq.QuestionGroupId) .HasColumnName("question_group_id"); // 配置 QuestionNumber 列 builder.Property(aq => aq.QuestionNumber) .HasColumnName("question_number") .IsRequired(); // uint 类型默认非空 // 配置 CreatedAt 列 builder.Property(aq => aq.CreatedAt) .HasColumnName("created_at") .IsRequired(); // 通常创建时间字段是非空的 builder.Property(aq => aq.Score) .HasColumnName("score"); // 配置 AssignmentGroupId 列 // 该列在数据库中名为 "detail_id" builder.Property(aq => aq.AssignmentGroupId) .HasColumnName("group_id") .IsRequired(); builder.Property(aq => aq.IsGroup) .HasColumnName("is_group") // 修正为一致的列名 .IsRequired(); // IsGroup 应该是必需的 // 配置 IsDeleted 列 builder.Property(aq => aq.IsDeleted) .HasColumnName("deleted") .HasDefaultValue(false); // 适用于软删除策略 // 4. 配置导航属性和外键关系 // --- // 配置 AssignmentQuestion 到 Question 的关系 (多对一) // 一个 AssignmentQuestion 属于一个 Question。 // // 假设 `Question` 实体中有一个名为 `AssignmentQuestions` 的 `ICollection` 集合属性。 builder.HasOne(aq => aq.Question) // 当前 AssignmentQuestion 有一个 Question .WithMany(q => q.AssignmentQuestions) // 那个 Question 可以有多个 AssignmentQuestion .HasForeignKey(aq => aq.QuestionId) // 外键是 AssignmentQuestion.QuestionId .OnDelete(DeleteBehavior.Cascade); // 当 Question 被删除时,相关的 AssignmentQuestion 也级联删除。 builder.HasOne(aq => aq.QuestionGroup) .WithMany(qg => qg.AssignmentQuestions) .HasForeignKey(aq => aq.QuestionGroupId) .OnDelete(DeleteBehavior.SetNull); // --- // 配置 AssignmentQuestion 到 AssignmentGroup 的关系 (多对一) // 一个 AssignmentQuestion 属于一个 AssignmentGroup。 // // 你的 `AssignmentQuestion` 类现在有了 `public AssignmentGroup AssignmentGroup { get; set; }` // 这是一个非常好的改进,它与 `AssignmentGroupId` 外键完美匹配。 // 假设 `AssignmentGroup` 实体中有一个名为 `AssignmentQuestions` 的 `ICollection` 集合属性。 builder.HasOne(aq => aq.AssignmentGroup) // 当前 AssignmentQuestion 有一个 AssignmentGroup .WithMany(ag => ag.AssignmentQuestions) // 那个 AssignmentGroup 可以有多个 AssignmentQuestion .HasForeignKey(aq => aq.AssignmentGroupId) // 外键是 AssignmentQuestion.AssignmentGroupId (列名 detail_id) .OnDelete(DeleteBehavior.Cascade); // 当 AssignmentGroup 被删除时,相关的 AssignmentQuestion 也级联删除。 // --- // 配置 AssignmentQuestion 到 SubmissionDetail 的关系 (一对多) // 一个 AssignmentQuestion 可以有多个 SubmissionDetail。 // // 这个关系通常从 "多" 的一方(`SubmissionDetail` 实体)来配置外键。 // 假设 `SubmissionDetail` 实体有一个 `AssignmentQuestionId` 外键和 `AssignmentQuestion` 导航属性。 builder.HasMany(aq => aq.SubmissionDetails) // 当前 AssignmentQuestion 有多个 SubmissionDetail .WithOne(sd => sd.AssignmentQuestion); // 每一个 SubmissionDetail 都有一个 AssignmentQuestion // .HasForeignKey(sd => sd.AssignmentQuestionId); // 外键的配置应在 `SubmissionDetailConfiguration` 中进行 } } }