using Entities.Contracts; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore; namespace TechHelper.Context.Configuration { public class ClassTeacherConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { // 1. 设置表名 // 将此实体映射到数据库中名为 "class_teachers" 的表。 builder.ToTable("class_teachers"); // 2. 设置复合主键 // ClassId 和 TeacherId 的组合作为主键,确保一个班级中一个老师只有一条任教记录。 // 这要求 ClassTeacher 类中的 ClassId 和 TeacherId 属性上都添加了 [Key] 特性。 builder.HasKey(ct => new { ct.ClassId, ct.TeacherId }); // 3. 配置列名和属性特性 // 配置 ClassId 属性对应的数据库列名为 "class_id"。 builder.Property(ct => ct.ClassId) .HasColumnName("class_id"); // 配置 TeacherId 属性对应的数据库列名为 "teacher_id"。 builder.Property(ct => ct.TeacherId) .HasColumnName("teacher_id"); // 配置 SubjectTaught 属性对应的数据库列名为 "subject_taught"。 // 假设 SubjectTaught 可以为空,所以没有 .IsRequired() builder.Property(ct => ct.SubjectTaught) .HasColumnName("subject_taught"); // 4. 配置导航属性和外键关系 // --- // 配置 ClassTeacher 到 Class 的关系 (多对一) // 一个 ClassTeacher 联结记录属于一个 Class。 // // 假设 `Class` 实体中有一个名为 `ClassTeachers` 的 `ICollection` 集合属性。 builder.HasOne(ct => ct.Class) // 当前 ClassTeacher 链接到一个 Class .WithMany(c => c.ClassTeachers) // 那个 Class 可以有多个 ClassTeacher 记录 .HasForeignKey(ct => ct.ClassId) // 外键是 ClassTeacher.ClassId .OnDelete(DeleteBehavior.Cascade); // 当 Class 被删除时,相关的 ClassTeacher 记录也级联删除。 // --- // 配置 ClassTeacher 到 User (Teacher) 的关系 (多对一) // 一个 ClassTeacher 联结记录属于一个 User (作为 Teacher)。 // // 假设 `User` 实体中有一个名为 `TaughtClassesLink` 的 `ICollection` 集合属性, // 用于表示该用户所教授的班级联结记录。 builder.HasOne(ct => ct.Teacher) // 当前 ClassTeacher 链接到一个 User (老师) .WithMany(u => u.TaughtClassesLink) // 那个 User (老师) 可以有多个 ClassTeacher 记录 (为所教授的班级) .HasForeignKey(ct => ct.TeacherId) // 外键是 ClassTeacher.TeacherId .OnDelete(DeleteBehavior.Restrict); // 当 User (老师) 被删除时,如果还有相关的 ClassTeacher 记录,则会阻止删除。 // 这通常是防止数据丢失的更安全选择。如果你希望老师被删除时,其所有任教关系也一并删除,可改为 DeleteBehavior.Cascade。 } } }