Files
TechHelper/TechHelper.Server/Context/Configuration/UserConfiguration.cs
2025-05-23 19:03:00 +08:00

77 lines
4.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Entities.Contracts;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore;
namespace TechHelper.Context.Configuration
{
public class UserConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
// 映射到表名:如果 User 类上没有 [Table("users")],默认是 "AspNetUsers"。
// 显式指定可以确保你的数据库表名和你期望的一致。
builder.ToTable("AspNetUsers");
// IdentityUser 的 Id 属性和其他标准属性(如 UserName, Email 等)
// 大多由 IdentityDbContext 自动处理,通常不需要在这里显式配置主键或默认列。
// 配置自定义属性
builder.Property(u => u.RefreshToken)
.HasColumnName("refresh_token");
builder.Property(u => u.RefreshTokenExpiryTime)
.HasColumnName("refresh_token_expiry_time");
builder.Property(u => u.IsDeleted)
.HasColumnName("deleted")
.HasDefaultValue(false); // 软删除标记,默认 false
// 配置导航属性 (User 作为关系的“一”或“主”方)
// User 作为老师,与 ClassTeacher 的关系 (一对多)
builder.HasMany(u => u.TaughtClassesLink) // 一个 User (老师) 可以教授多个班级
.WithOne(ct => ct.Teacher) // 一个 ClassTeacher 记录对应一个 Teacher
.HasForeignKey(ct => ct.TeacherId) // 外键在 ClassTeacher.TeacherId
.OnDelete(DeleteBehavior.Restrict); // 限制删除:如果老师有任教记录,则不允许删除
// User 作为学生,与 ClassStudent 的关系 (一对多)
builder.HasMany(u => u.EnrolledClassesLink) // 一个 User (学生) 可以注册多个班级
.WithOne(cs => cs.Student) // 一个 ClassStudent 记录对应一个 Student
.HasForeignKey(cs => cs.StudentId) // 外键在 ClassStudent.StudentId
.OnDelete(DeleteBehavior.Restrict); // 限制删除:如果学生有注册记录,则不允许删除
// User 作为创建者,与 Question 的关系 (一对多)
builder.HasMany(u => u.CreatedQuestions) // 一个 User 可以创建多个题目
.WithOne(q => q.Creator) // 一个 Question 对应一个 Creator
.HasForeignKey(q => q.CreatedBy) // 外键在 Question.CreatedBy
.OnDelete(DeleteBehavior.Restrict); // 限制删除:如果创建者有题目,则不允许删除
// User 作为创建者,与 Assignment 的关系 (一对多)
builder.HasMany(u => u.CreatedAssignments) // 一个 User 可以创建多个作业
.WithOne(a => a.Creator) // 一个 Assignment 对应一个 Creator
.HasForeignKey(a => a.CreatedBy) // 外键在 Assignment.CreatedBy
.OnDelete(DeleteBehavior.Restrict); // 限制删除:如果创建者有作业,则不允许删除
// User 作为学生,与 SubmissionDetail 的关系 (一对多)
// 尽管 SubmissionDetail 也可以通过 Submission 间接关联到 User
// 但这里提供了直接访问的导航属性,以方便直接查询学生的所有作答详情。
builder.HasMany(u => u.SubmissionDetails) // 一个 User (学生) 可以有多个提交详情记录
.WithOne(sd => sd.User) // 一个 SubmissionDetail 对应一个 User (学生)
.HasForeignKey(sd => sd.StudentId) // 外键在 SubmissionDetail.StudentId
.OnDelete(DeleteBehavior.Restrict); // 限制删除:如果学生有提交详情,则不允许删除
// User 作为学生,与 Submission 的关系 (一对多)
builder.HasMany(u => u.SubmissionsAsStudent) // 一个 User (学生) 可以有多个提交记录
.WithOne(s => s.Student) // 一个 Submission 对应一个 Student
.HasForeignKey(s => s.StudentId) // 外键在 Submission.StudentId
.OnDelete(DeleteBehavior.Restrict); // 限制删除:如果学生有提交记录,则不允许删除
// User 作为批改者,与 Submission 的关系 (一对多)
builder.HasMany(u => u.GradedSubmissions) // 一个 User (批改者) 可以批改多个提交
.WithOne(s => s.Grader) // 一个 Submission 对应一个 Grader
.HasForeignKey(s => s.GradedBy) // 外键在 Submission.GradedBy
.OnDelete(DeleteBehavior.SetNull); // 因为 GradedBy 是可空的,所以批改者删除时,设为 NULL
}
}
}