如何用EF Code First实现三张表关联并生成JobCVStatus中间表
EF Code First实现Job-CV-Status关联表的方案
要实现包含JobId、CVId、StatusId的JobCVStatus关联表,由于这是带额外属性的多对多关联(并非单纯的Job和CV双向多对多,还绑定了Status状态),需要显式定义关联实体并通过Fluent API配置关联规则,具体步骤如下:
1. 定义实体类
首先创建基础实体和关联实体:
基础实体类
// 职位实体 public class Job { public int JobId { get; set; } public string Title { get; set; } // 其他业务属性(如描述、发布日期等) public ICollection<JobCVStatus> JobCVStatuses { get; set; } = new List<JobCVStatus>(); } // 简历实体 public class CV { public int CVId { get; set; } public string ApplicantName { get; set; } // 其他业务属性(如技能、工作经历等) public ICollection<JobCVStatus> JobCVStatuses { get; set; } = new List<JobCVStatus>(); } // 状态实体(接受/拒绝等) public class Status { public int StatusId { get; set; } public string Name { get; set; } // 示例值:"Accepted", "Rejected" // 其他业务属性(如状态描述) public ICollection<JobCVStatus> JobCVStatuses { get; set; } = new List<JobCVStatus>(); }
关联实体类JobCVStatus
这个类对应要生成的中间表,包含三个外键和导航属性:
public class JobCVStatus { // 外键字段 public int JobId { get; set; } public int CVId { get; set; } public int StatusId { get; set; } // 导航属性 public Job Job { get; set; } public CV CV { get; set; } public Status Status { get; set; } }
2. 配置DbContext与关联规则
通过Fluent API在DbContext中配置复合主键、外键关联和删除行为:
public class AppDbContext : DbContext { // 声明DbSet public DbSet<Job> Jobs { get; set; } public DbSet<CV> CVs { get; set; } public DbSet<Status> Statuses { get; set; } public DbSet<JobCVStatus> JobCVStatuses { get; set; } // 配置数据库连接 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Your_Connection_String_Here"); } // 配置实体关联 protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置JobCVStatus的复合主键:一个简历对应一个职位只能有一条状态记录 modelBuilder.Entity<JobCVStatus>() .HasKey(jcs => new { jcs.JobId, jcs.CVId }); // 关联Job表 modelBuilder.Entity<JobCVStatus>() .HasOne(jcs => jcs.Job) .WithMany(job => job.JobCVStatuses) .HasForeignKey(jcs => jcs.JobId) .OnDelete(DeleteBehavior.Cascade); // 删除职位时自动删除关联的投递记录 // 关联CV表 modelBuilder.Entity<JobCVStatus>() .HasOne(jcs => jcs.CV) .WithMany(cv => cv.JobCVStatuses) .HasForeignKey(jcs => jcs.CVId) .OnDelete(DeleteBehavior.Cascade); // 删除简历时自动删除关联的投递记录 // 关联Status表 modelBuilder.Entity<JobCVStatus>() .HasOne(jcs => jcs.Status) .WithMany(status => status.JobCVStatuses) .HasForeignKey(jcs => jcs.StatusId) .OnDelete(DeleteBehavior.Restrict); // 禁止删除正在被使用的状态 } }
3. 生成数据库并验证
通过EF迁移命令生成数据库表:
# 初始化迁移(Package Manager Console或终端) Add-Migration InitialCreate # 将迁移应用到数据库 Update-Database
执行完成后,数据库中会生成JobCVStatus表,包含JobId、CVId、StatusId三个字段,其中JobId和CVId作为复合主键,三个字段分别外键关联到Jobs、CVs、Statuses表。
内容的提问来源于stack exchange,提问作者Sanjeewa Dissanayake
相关产品推荐
相关产品推荐

