using Entities.Contracts; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace TechHelper.Context.Configuration { public class ClassConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { // 1. 表名映射 builder.ToTable("classes"); // 2. 主键 builder.HasKey(c => c.Id); builder.Property(c => c.Id) .HasColumnName("id"); builder.Property(c => c.Grade) .HasColumnName("grade"); // 3. Name 属性 builder.Property(c => c.Number) .HasColumnName("class"); // 4. Description 属性 builder.Property(c => c.Description) .HasColumnName("description") .IsRequired(false); // 明确其为可选,尽管 string 类型默认是可空的。 // 5. TeacherId (外键) builder.Property(c => c.HeadTeacherId) .HasColumnName("head_teacher_id") .IsRequired(false); // 6. CreatedAt 属性 builder.Property(c => c.CreatedAt) .HasColumnName("created_at") .IsRequired() .ValueGeneratedOnAdd(); // DateTime 是非可空类型,因此按类型是必需的。 // 如果希望数据库在创建时设置默认值,可以考虑 .HasDefaultValueSql("GETUTCDATE()") (SQL Server) 或类似方法。 // 7. UpdatedAt 属性 builder.Property(c => c.UpdatedAt) .HasColumnName("updated_at") .IsRequired() .ValueGeneratedOnAddOrUpdate(); // DateTime 是非可空类型。 // 如果需要在修改时自动更新,可以考虑配置(例如通过拦截器或触发器)。 // 8. IsDeleted 属性 (用于软删除) builder.Property(c => c.IsDeleted) .HasColumnName("deleted") .IsRequired() .HasDefaultValue(false); // 通常默认为未删除。 // --- 导航属性配置 --- // 9. 与 User (Teacher) 的关系 builder.Property(c => c.HeadTeacherId).HasColumnName("head_teacher_id"); builder.HasOne(c => c.HeadTeacher) // Class 实体中的导航属性 .WithMany() // User 实体中可以不定义反向导航到其作为班主任的班级集合 // 如果 User 实体中有 public ICollection HeadManagedClasses { get; set; } // 则这里应为 .WithMany(u => u.HeadManagedClasses) .HasForeignKey(c => c.HeadTeacherId) // Class 实体中的外键 .IsRequired() // 班主任是必需的 .OnDelete(DeleteBehavior.Restrict); // 删除用户时,如果其是班主任,则限制删除 // --- 授课老师关系 (多对多) --- // 这个关系主要通过 ClassTeacherConfiguration 来定义其两端。 // Class 到 ClassTeacher 是一对多。 builder.HasMany(c => c.ClassTeachers) // Class 实体中的集合导航属性 .WithOne(ct => ct.Class) // ClassTeacher 实体中指向 Class 的导航属性 .HasForeignKey(ct => ct.ClassId) // ClassTeacher 实体中的外键 .OnDelete(DeleteBehavior.Cascade); // 如果班级被删除,相关的教师关联也应删除 // 10. 与 ClassStudent 的关系 (多对多中间表或一对多) // 一对多:一个 Class 有多个 ClassStudent。一个 ClassStudent 属于一个 Class。 // 假设 ClassStudent 有 'ClassId' 外键和 'Class' 导航属性。 builder.HasMany(c => c.ClassStudents) // Class 中的集合导航属性 .WithOne(cs => cs.Class) // 假设 ClassStudent 中有 'public Class Class { get; set; }' .HasForeignKey(cs => cs.ClassId) // 假设 ClassStudent 中有 'public Guid ClassId { get; set; }' .OnDelete(DeleteBehavior.Cascade); // 常见:如果一个班级被删除,其学生注册记录也应被删除。 // 11. 与 AssignmentClass 的关系 (多对多中间表或一对多) // 一对多:一个 Class 有多个 AssignmentClass。一个 AssignmentClass 属于一个 Class。 // 假设 AssignmentClass 有 'ClassId' 外键和 'Class' 导航属性。 builder.HasMany(c => c.AssignmentClasses) // Class 中的集合导航属性 .WithOne(ac => ac.Class) // 假设 AssignmentClass 中有 'public Class Class { get; set; }' .HasForeignKey(ac => ac.ClassId) // 假设 AssignmentClass 中有 'public Guid ClassId { get; set; }' .OnDelete(DeleteBehavior.Cascade); // 常见:如果一个班级被删除,其作业关联也应被删除。 // --- 可选:索引 --- // builder.HasIndex(c => c.TeacherId).HasDatabaseName("IX_classes_teacher_id"); // builder.HasIndex(c => c.Name).IsUnique(false).HasDatabaseName("IX_classes_name"); // 如果经常按名称搜索 } } }