添加项目文件。
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
using Entities.Contracts;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||
|
||||
namespace TechHelper.Context.Configuration
|
||||
{
|
||||
public class ClassConfiguration : IEntityTypeConfiguration<Class>
|
||||
{
|
||||
public void Configure(EntityTypeBuilder<Class> 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<Class> 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"); // 如果经常按名称搜索
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user