Resumo : neste tutorial, você aprenderá sobre os relacionamentos muitos para muitos do EF Core e como modelá-los adequadamente.
Introdução ao relacionamento muitos para muitos do EF Core
Os relacionamentos muitos para muitos permitem associar várias linhas de uma tabela a várias linhas de outra tabela.
Por exemplo, um funcionário pode ter diversas habilidades enquanto uma habilidade é processada por vários funcionários. Portanto, a relação entre funcionários e competências é uma relação muitos-para-muitos.
Para modelar um relacionamento muitos-para-muitos entre duas tabelas, geralmente usamos uma tabela de junção e dois relacionamentos um-para-muitos :
Neste diagrama, EmloyeeSkill
é uma tabela de junção que possui duas colunas:
EmployeeId
– o funcionárioId
que faz referência àId
coluna daEmployees
tabela. theEmployeeId
é uma chave estrangeira para aEmployees
tabela.SkillId
– a habilidadeId
que faz referência àId
coluna daSkills
tabela. ASkillId
coluna é uma chave estrangeira daSkills
tabela.- Além disso,
EmployeeId
as colunas eSkillId
formam a chave primária daEmployeeSkill
tabela. Como a chave primária possui duas colunas, ela é chamada de chave composta. Ele garante que um funcionário possua uma habilidade por vez e vice-versa.
No EF Core, um relacionamento muitos para muitos associa um número de entidades de um tipo de entidade a qualquer número de entidades do mesmo ou de outro tipo de entidade.
A maneira mais fácil de modelar um relacionamento muitos-para-muitos entre duas entidades é definir uma propriedade de navegação em ambas as extremidades. Por exemplo:
public class Employee
{
public int Id { get; set; }
public required string FirstName { get; set; }
public required string LastName { get; set; }
public required decimal Salary { get; set; }
public required DateTime JoinedDate { get; set; }
public int DepartmentId { get; set; }
// Reference navigation to Department
public Department Department { get; set; } = null!;
// Reference navigation to EmployeeProfile
public EmployeeProfile? Profile { get; set; }
// collection navigation to Employee
public List<Skill> Skills { get; set; } = new();
}
public class Skill
{
public int Id { get; set; }
public required string Title { get;set; }
// collection navigation to Employee
public List<Employee> Employees { get; set; } = new();
}
Linguagem de código: C# ( cs )
Neste exemplo, a Employee
classe possui uma coleção de Skills
e a Skill
classe possui uma coleção de Employees
.
A HRContext
classe define ambos Employee
e Skill
DbSet
:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
namespace HR;
public class HRContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
public DbSet<Department> Departments { get; set; }
public DbSet<EmployeeProfile> EmployeeProfiles { get; set; }
public DbSet<Skill> Skills { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var connectionString = configuration.GetConnectionString("Local");
optionsBuilder.UseSqlServer(connectionString)
.LogTo(Console.WriteLine,
new[] { DbLoggerCategory.Database.Command.Name },
LogLevel.Information)
.EnableSensitiveDataLogging();
}
}
Linguagem de código: C# ( cs )
Por convenção, o EF Core criará três tabelas: Employees
, Skills
e EmployeeSkill
tabelas.
Resumo
- Use relacionamentos muitos para muitos para associar qualquer número de entidades de um tipo de entidade a qualquer número de entidades do mesmo ou de outro tipo.
- Defina a coleção de navegação em ambos os tipos de entidade para modelar um relacionamento muitos para muitos.