在实体框架(Entity Framework)中,连接表(Join Table)用于处理多对多关系。当两个实体之间存在多对多关系时,EF会在数据库中创建一个连接表来维护这种关系。
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public ICollection<UserRole> UserRoles { get; set; }
}
public class Role
{
public int RoleId { get; set; }
public string Name { get; set; }
public ICollection<UserRole> UserRoles { get; set; }
}
public class UserRole
{
public int UserId { get; set; }
public User User { get; set; }
public int RoleId { get; set; }
public Role Role { get; set; }
public DateTime AssignedDate { get; set; } // 额外属性
}
// DbContext配置
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserRole>()
.HasKey(ur => new { ur.UserId, ur.RoleId });
modelBuilder.Entity<UserRole>()
.HasOne(ur => ur.User)
.WithMany(u => u.UserRoles)
.HasForeignKey(ur => ur.UserId);
modelBuilder.Entity<UserRole>()
.HasOne(ur => ur.Role)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.RoleId);
}
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public ICollection<StudentCourse> StudentCourses { get; set; }
public ICollection<StudentClub> StudentClubs { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string Title { get; set; }
public ICollection<StudentCourse> StudentCourses { get; set; }
}
public class Club
{
public int ClubId { get; set; }
public string Name { get; set; }
public ICollection<StudentClub> StudentClubs { get; set; }
}
public class StudentCourse
{
public int StudentId { get; set; }
public Student Student { get; set; }
public int CourseId { get; set; }
public Course Course { get; set; }
public int? Grade { get; set; }
}
public class StudentClub
{
public int StudentId { get; set; }
public Student Student { get; set; }
public int ClubId { get; set; }
public Club Club { get; set; }
public DateTime JoinDate { get; set; }
}
原因:实体间相互引用导致JSON序列化时无限循环
解决方案:
// 在DbContext中配置
builder.Entity<User>().Ignore(u => u.UserRoles);
// 或者使用DTO进行序列化
原因:未正确设置实体状态或保存顺序
解决方案:
// 确保先保存主实体
context.Users.Add(user);
context.Roles.Add(role);
context.SaveChanges();
// 然后保存连接实体
var userRole = new UserRole { UserId = user.UserId, RoleId = role.RoleId };
context.UserRoles.Add(userRole);
context.SaveChanges();
原因:未正确使用Include或ThenInclude导致多次查询
解决方案:
var usersWithRoles = context.Users
.Include(u => u.UserRoles)
.ThenInclude(ur => ur.Role)
.ToList();
通过合理使用多个连接表,可以构建复杂但清晰的数据关系模型,满足各种业务场景需求。