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 Employees
tabela é que raramente usamos telefone e e-mail quando trabalhamos com Employee
objetos.
No banco de dados, teremos duas tabelas separadas Employees
e EmployeeProfiles
. A EmployeeProfiles
tabela terá uma chave estrangeira EmployeeId
que faz referência à Id
tabela Emloyees
:
Com base neste diagrama de banco de dados, uma linha da Employees
tabela pode ser associada a uma ou mais linhas da EmployeeProfiles
tabela.
Para impor o relacionamento um-para-um, os valores na EmployeeId
coluna da EmployeeProfiles
necessidade 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 Employee
e :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
Employee
classe possui uma propriedadeProfile
que é uma navegação de referência para aEmployeeProfile
classe (filho). - O
EmployeeProfile
possui uma propriedade de chave estrangeira obrigatóriaEmployeeId
e navegação de referência noEmployee
(pai).
Com base nessas classes e DbSet
definidas na HRContext
classe EF Core gera as seguintes tabelas no Banco de Dados SQL Sever:
Emloyees
mesa:
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 )
EmployeeProfiles
mesa:
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 EmployeeId
coluna da EmployeeProfiles
tabela para garantir que uma linha da Employees
tabela possa ser associada a no máximo uma linha da EmloyeeProfiles
tabela.
O EF Core também define a ON DELETE CASCADE
chave estrangeira EmployeeId
na EmployeeProfile
tabela. Portanto, se você excluir uma linha da Employees
tabela, a linha correspondente na tabela EmployeeProfile
també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.