You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core多对多关系中间表数据插入方法及实体类创建

EF Core 实现多对多关联插入及实体类定义

1. 定义实体类

员工实体(Employees)

public class Employee
{
    public int ID { get; set; }
    public string EmpName { get; set; }

    // 导航属性:关联的项目集合
    public ICollection<EmployeeProject> EmployeeProjects { get; set; } = new List<EmployeeProject>();
}

项目实体(Project)

public class Project
{
    public int ID { get; set; }
    public string ProjectName { get; set; }

    // 导航属性:关联的员工集合
    public ICollection<EmployeeProject> EmployeeProjects { get; set; } = new List<EmployeeProject>();
}

中间关联实体(EmployeesProject)

public class EmployeeProject
{
    public int EmpID { get; set; }
    public Employee Employee { get; set; }

    public int ProjectID { get; set; }
    public Project Project { get; set; }
}

2. 在DbContext中配置多对多关系

在自定义DbContext的OnModelCreating方法中配置关联规则,指定中间表的复合主键与外键映射:

public class AppDbContext : DbContext
{
    public DbSet<Employee> Employees { get; set; }
    public DbSet<Project> Projects { get; set; }
    public DbSet<EmployeeProject> EmployeeProjects { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 配置中间表的复合主键
        modelBuilder.Entity<EmployeeProject>()
            .HasKey(ep => new { ep.EmpID, ep.ProjectID });

        // 配置员工与中间表的关联
        modelBuilder.Entity<EmployeeProject>()
            .HasOne(ep => ep.Employee)
            .WithMany(e => e.EmployeeProjects)
            .HasForeignKey(ep => ep.EmpID);

        // 配置项目与中间表的关联
        modelBuilder.Entity<EmployeeProject>()
            .HasOne(ep => ep.Project)
            .WithMany(p => p.EmployeeProjects)
            .HasForeignKey(ep => ep.ProjectID);
    }

    // 配置数据库连接(替换为你的实际连接字符串)
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("你的数据库连接字符串");
    }
}

3. 插入关联数据的几种实现方式

方式一:直接创建中间表实体插入

已知已存在的员工ID和项目ID时,直接实例化中间表实体添加:

using var context = new AppDbContext();

// 关联ID为1的员工与ID为2的项目
var empProject = new EmployeeProject
{
    EmpID = 1,
    ProjectID = 2
};

context.EmployeeProjects.Add(empProject);
context.SaveChanges();

方式二:通过导航属性添加关联

已加载员工或项目实体时,通过导航属性关联:

using var context = new AppDbContext();

// 获取已存在的员工和项目
var employee = context.Employees.Find(1);
var project = context.Projects.Find(2);

// 从员工侧添加关联
employee.EmployeeProjects.Add(new EmployeeProject { Project = project });

context.SaveChanges();

方式三:批量插入关联

一次性添加多组关联关系:

using var context = new AppDbContext();

var empProjects = new List<EmployeeProject>
{
    new EmployeeProject { EmpID = 1, ProjectID = 2 },
    new EmployeeProject { EmpID = 1, ProjectID = 3 },
    new EmployeeProject { EmpID = 2, ProjectID = 2 }
};

context.EmployeeProjects.AddRange(empProjects);
context.SaveChanges();

内容的提问来源于stack exchange,提问作者Erum Mirza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:57:17