Relacionamentos muitos-para-muitos do EF Core

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ário Idque faz referência à Idcoluna da Employeestabela. the EmployeeIdé uma chave estrangeira para a Employeestabela.
  • SkillId– a habilidade Idque faz referência à Idcoluna da Skillstabela. A SkillIdcoluna é uma chave estrangeira da Skillstabela.
  • Além disso, EmployeeIdas colunas e SkillIdformam a chave primária da EmployeeSkilltabela. 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 Employeeclasse possui uma coleção de Skillse a Skillclasse possui uma coleção de Employees.

A HRContextclasse define ambos Employeee 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, Skillse EmployeeSkilltabelas.

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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *