Реализация связи многие ко многим в EntityFramework
Создаю проект на ASP.net Core. У меня есть работники, которые могут работать над несколькими проектами и проекты, над которыми могут работать несколько работников. Создал следующие классы:
public class Project
{
public int Id { get; set; }
public string? ProjectName { get; set; }
public string? CustomerCompany { get; set; }
public string? ExecutorCompany { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public int Priority { get; set; }
public int? ProjectManagerId { get; set; }
public Employee? ProjectManager { get; set; }
public List<Employee> Employees { get; set; } = new();
public List<EmployeeProject> EmployeeProjects { get; set; } = new();
}
public class Employee
{
public int Id { get; set; }
public string? FirstName { get; set; }
public string? Surname { get; set; }
public string? Patronymic { get; set; }
public string? Email { get; set; }
public List<Project> Projects { get; set; } = new();
public List<EmployeeProject> EmployeeProjects { get; set; } = new();
}
public class EmployeeProject
{
public int EmployeeId { get; set; }
public Employee? Employee { get; set; }
public int ProjectId { get; set; }
public Project? Project { get; set; }
}
public class AppDbContext : DbContext
{
public DbSet<Employee> Employees { get; set; } = null!;
public DbSet<Project> Projects { get; set; } = null!;
public AppDbContext(DbContextOptions<AppDbContext> options): base(options)
{
Database.EnsureDeleted();
Database.EnsureCreated();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>().HasData(
new Employee { Id = 1, FirstName = "Tom", Surname = "A" },
new Employee { Id = 2, FirstName = "Bob", Surname = "B" },
new Employee { Id = 3, FirstName = "Sam", Surname = "С" });
modelBuilder.Entity<Project>().HasData(
new Project { Id = 1, ProjectName = "Project 1", },
new Project { Id = 2, ProjectName = "Project 2", });
modelBuilder.Entity<EmployeeProject>().HasData(
new EmployeeProject { EmployeeId = 1, ProjectId = 1 },
new EmployeeProject { EmployeeId = 1, ProjectId = 2 });
modelBuilder
.Entity<Project>()
.HasMany(c => c.Employees)
.WithMany(s => s.Projects)
.UsingEntity<EmployeeProject>(
j => j
.HasOne(pt => pt.Employee)
.WithMany(t => t.EmployeeProjects)
.HasForeignKey(pt => pt.EmployeeId),
j => j
.HasOne(pt => pt.Project)
.WithMany(p => p.EmployeeProjects)
.HasForeignKey(pt => pt.ProjectId),
j =>
{
j.HasKey(t => new { t.ProjectId, t.EmployeeId });
j.ToTable("EmployeeProjects");
});
modelBuilder
.Entity<Project>()
.HasOne(c => c.ProjectManager)
.WithMany()
.HasForeignKey(p => p.ProjectManagerId)
.IsRequired(false);
}
}
Когда я запускаю метод app.MapGet("/", (AppDbContext db) => db.Employees.ToList()) у меня ожидаемо в списке проектов у работников ничего нет. Как мне правильно реализовать связи, чтобы я мог без проблем потом обрабатывать запросы и передавать информацию о работниках через JSON?