Relacionamentos individuais do EF Core

Resumo : neste tutorial, você aprenderá sobre os relacionamentos um para um do EF Core e como modelá-los adequadamente.

Introdução aos relacionamentos um para um do EF Core

Em um banco de dados relacional, um relacionamento um-para-um permite vincular duas tabelas de modo que uma linha de uma tabela seja associada, no máximo, a uma linha de outra tabela.

Por exemplo, um funcionário pode ter um perfil contendo telefone e email. A razão pela qual não colocamos esses campos na mesma Employeestabela é que raramente usamos telefone e e-mail quando trabalhamos com Employeeobjetos.

No banco de dados, teremos duas tabelas separadas Employeese EmployeeProfiles. A EmployeeProfilestabela terá uma chave estrangeira EmployeeIdque faz referência à Idtabela Emloyees:

Com base neste diagrama de banco de dados, uma linha da Employeestabela pode ser associada a uma ou mais linhas da EmployeeProfilestabela.

Para impor o relacionamento um-para-um, os valores na EmployeeIdcoluna da EmployeeProfilesnecessidade devem ser exclusivos. Para fazer isso, você pode criar um índice exclusivo (ou restrição ) que inclua o arquivo EmployeeId.

Modelando relacionamentos um para um no EF Core

As classes a seguir ilustram como modelar um relacionamento um-para-um entre as entidades Employeee :EmployeeProfile

namespace HR;


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; }
}

public class EmployeeProfile
{
    public int Id { get; set;}
    public string Phone  { get;set;   }
    public string Email {   get;set;  }

    // Required foreign key property
    public int EmployeeId { get; set;}
    
    // Required reference navigation to Employee
    public Employee Employee  { get; set;} = null!;
}Linguagem de código:  C#  ( cs )

Nestas aulas:

  • A Employeeclasse possui uma propriedade Profileque é uma navegação de referência para a EmployeeProfileclasse (filho).
  • O EmployeeProfilepossui uma propriedade de chave estrangeira obrigatória EmployeeIde navegação de referência no Employee(pai).

Com base nessas classes e DbSetdefinidas na HRContextclasse EF Core gera as seguintes tabelas no Banco de Dados SQL Sever:

Emloyeesmesa:

CREATE TABLE [dbo].[Employees] (
    [Id]           INT             IDENTITY (1, 1) NOT NULL,
    [FirstName]    NVARCHAR (MAX)  NOT NULL,
    [LastName]     NVARCHAR (MAX)  NOT NULL,
    [Salary]       DECIMAL (18, 2) NOT NULL,
    [JoinedDate]   DATETIME2 (7)   NOT NULL,
    [DepartmentId] INT             NOT NULL,
    CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Employees_Departments_DepartmentId] FOREIGN KEY ([DepartmentId]) REFERENCES [dbo].[Departments] ([Id]) ON DELETE CASCADE
);


GO
CREATE NONCLUSTERED INDEX [IX_Employees_DepartmentId]
    ON [dbo].[Employees]([DepartmentId] ASC);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

EmployeeProfilesmesa:

CREATE TABLE [dbo].[EmployeeProfiles] (
    [Id]         INT            IDENTITY (1, 1) NOT NULL,
    [Phone]      NVARCHAR (MAX) NOT NULL,
    [Email]      NVARCHAR (MAX) NOT NULL,
    [EmployeeId] INT            NOT NULL,
    CONSTRAINT [PK_EmployeeProfiles] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_EmployeeProfiles_Employees_EmployeeId] 
    FOREIGN KEY ([EmployeeId]) 
    REFERENCES [dbo].[Employees] ([Id]) ON DELETE CASCADE
);


GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_EmployeeProfiles_EmployeeId]
    ON [dbo].[EmployeeProfiles]([EmployeeId] ASC);
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

O EF Core cria um índice exclusivo na EmployeeIdcoluna da EmployeeProfilestabela para garantir que uma linha da Employeestabela possa ser associada a no máximo uma linha da EmloyeeProfilestabela.

O EF Core também define a ON DELETE CASCADEchave estrangeira EmployeeIdna EmployeeProfiletabela. Portanto, se você excluir uma linha da Employeestabela, a linha correspondente na tabela EmployeeProfiletambém será excluída.

Resumo

  • Os relacionamentos um-para-um permitem que uma entidade seja associada a no máximo uma outra entidade.
  • Use propriedades de navegação em ambas as classes com uma chave estrangeira na classe filha para modelar um relacionamento um-para-um do EF Core.

Deixe um comentário

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