using Entities.Contracts; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore; namespace TechHelper.Context.Configuration { public class ClassStudentConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { // 1. 设置表名 // 将此实体映射到数据库中名为 "class_student" 的表。 builder.ToTable("class_student"); // 2. 设置复合主键 // ClassId 和 StudentId 的组合作为主键,确保一个班级中一个学生只有一条入学记录。 builder.HasKey(cs => new { cs.ClassId, cs.StudentId }); // 3. 配置列名和属性特性 // 配置 ClassId 属性对应的数据库列名为 "class_id"。 builder.Property(cs => cs.ClassId) .HasColumnName("class_id"); // 配置 StudentId 属性对应的数据库列名为 "student_id"。 builder.Property(cs => cs.StudentId) .HasColumnName("student_id"); // 配置 EnrollmentDate 属性对应的数据库列名为 "enrollment_date",并设置为必需字段。 builder.Property(cs => cs.EnrollmentDate) .HasColumnName("enrollment_date") .IsRequired(); // 配置 IsDeleted 属性对应的数据库列名为 "deleted",并设置默认值为 false。 builder.Property(cs => cs.IsDeleted) .HasColumnName("deleted") .HasDefaultValue(false); // 常用作软删除标记 // 4. 配置导航属性和外键关系 // --- // 配置 ClassStudent 到 Class 的关系 (多对一) // 一个 ClassStudent 联结记录属于一个 Class。 // // 假设 `Class` 实体中有一个名为 `ClassStudents` 的 `ICollection` 集合属性。 builder.HasOne(cs => cs.Class) // 当前 ClassStudent 链接到一个 Class .WithMany(c => c.ClassStudents) // 那个 Class 可以有多个 ClassStudent 记录 .HasForeignKey(cs => cs.ClassId) // 外键是 ClassStudent.ClassId .OnDelete(DeleteBehavior.Cascade); // 当 Class 被删除时,相关的 ClassStudent 记录也级联删除。 // --- // 配置 ClassStudent 到 User (Student) 的关系 (多对一) // 一个 ClassStudent 联结记录属于一个 User (作为 Student)。 // // 假设 `User` 实体中有一个名为 `EnrolledClassesLink` 的 `ICollection` 集合属性, // 用于表示该用户所注册的班级联结记录 (与 `ClassTeacherConfiguration` 中的模式类似)。 builder.HasOne(cs => cs.Student) // 当前 ClassStudent 链接到一个 User (学生) .WithMany(u => u.EnrolledClassesLink) // 那个 User (学生) 可以有多个 ClassStudent 记录 .HasForeignKey(cs => cs.StudentId) // 外键是 ClassStudent.StudentId .OnDelete(DeleteBehavior.Restrict); // 当 User (学生) 被删除时,如果还有相关的 ClassStudent 记录,则会阻止删除。 // 这是更安全的做法,以避免意外数据丢失。如果你希望学生被删除时,其所有注册关系也一并删除,可改为 DeleteBehavior.Cascade。 } } }