Introdução aos relacionamentos - EF Core (2024)

  • Artigo

Este documento fornece uma introdução simples à representação de relacionamentos em modelos de objeto e bancos de dados relacionais, incluindo como o EF Core mapeia entre os dois.

Relacionamentos em modelos de objeto

Um relacionamento define como duas entidades se relacionam entre si. Por exemplo, ao modelar postagens em um blog, cada postagem está relacionada ao blog em que foi publicada e o blog está relacionado a todas as postagens publicadas nesse blog.

Em uma linguagem orientada a objetos como C#, o blog e a postagem são normalmente representados por duas classes:blogePublicar. Por exemplo:

public class Blog{ public string Nome { get; definir; } public virtual Uri SiteUri { get; definir; }}
public class Post{ public string Title { get; definir; } public string Content { get; definir; } public DateTime PublishedOn { get; definir; } public bool Arquivado { get; definir; }}

Nas classes acima, não há nada que indique queblogePublicarsão relacionados. Isso pode ser adicionado ao modelo de objeto adicionando uma referência dePublicarpara oblogem que é publicado:

public class Post{ public string Title { get; definir; } public string Content { get; definir; } public DateOnly PublishedOn { get; definir; } public bool Arquivado { get; definir; } Public Blog Blog { obter; definir; }}

Da mesma forma, a direção oposta da mesma relação pode ser representada como uma coleção dePublicarobjetos em cadablog:

public class Blog{ public string Nome { get; definir; } public virtual Uri SiteUri { get; definir; } public ICollection Postagens { get; }}

Esta conexão deblogparaPublicare, inversamente, dePublicarde volta ablogé conhecido como um "relacionamento" no EF Core.

Importante

Asolteirorelacionamento pode normalmente ser percorrido em qualquer direção. Neste exemplo, isso é deblogparaPublicaratravés doPostagens no blogpropriedade, e dePublicarde volta ablogatravés doPost.Blogpropriedade. Isso éumrelacionamento, não dois.

Dica

No EF Core, oPostagens no blogePost.Blogpropriedades são chamadas de "navegações".

Relacionamentos em bancos de dados relacionais

Bancos de dados relacionais representam relacionamentos usando chaves estrangeiras. Por exemplo, usando SQL Server ou Azure SQL, as tabelas a seguir podem ser usadas para representar nossoPublicareblogAulas:

CREATE TABLE [Posts] ( [Id] int NOT NULL IDENTITY, [Title] nvarchar(max) NULL, [Content] nvarchar(max) NULL, [PublishedOn] datetime2 NOT NULL, [Archived] bit NOT NULL, [BlogId] int NOT NULL, CONSTRAINT [PK_Posts] PRIMARY KEY ([Id]), CONSTRAINT [FK_Posts_Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blogs] ([Id]) ON DELETE CASCADE);CREATE TABLE [Blogs] ( [Id] int NOT NULL IDENTITY, [Nome] nvarchar(max) NULL, [SiteUri] nvarchar(max) NULL, CONSTRAINT [PK_Blogs] PRIMARY KEY ([Id]));

Nesse modelo relacional, oPostagenseBloguescada tabela recebe uma coluna de "chave primária". O valor da chave primária identifica exclusivamente cada postagem ou blog. Além disso, oBloguestabela recebe uma coluna de "chave estrangeira". OBloguescoluna de chave primáriaEu iaé referenciado peloBlogIdcoluna de chave estrangeira doPostagensmesa. Esta coluna é "restringida" de forma que qualquer valor naBlogIdcoluna dePostagens devecorresponder a um valor noEu iacoluna deBlogues. Essa correspondência determina a qual blog cada postagem está relacionada. Por exemplo, se oBlogIdvalor em uma linha doPostagenstabela é 7, então a postagem representada por essa linha é publicada no blog com a chave primária 7.

Mapeando relacionamentos no EF Core

O mapeamento de relacionamento do EF Core tem tudo a ver com o mapeamento da representação de chave primária/chave estrangeira usada em um banco de dados relacional para as referências entre objetos usados ​​em um modelo de objeto.

No sentido mais básico, isso envolve:

  • Adicionar uma propriedade de chave primária a cada tipo de entidade.
  • Adicionar uma propriedade de chave estrangeira a um tipo de entidade.
  • Associar as referências entre os tipos de entidade com as chaves primária e estrangeira para formar uma única configuração de relacionamento.

Depois que esse mapeamento é feito, o EF altera os valores de chave estrangeira conforme necessário quando as referências entre objetos mudam e altera as referências entre objetos conforme necessário quando os valores de chave estrangeira mudam.

Observação

As chaves primárias são usadas para mais do que relacionamentos de mapeamento. VerChavesPara maiores informações.

Por exemplo, os tipos de entidade mostrados acima podem ser atualizados com propriedades de chave primária e estrangeira:

public class Blog{ public int Id { get; definir; } string pública Nome { get; definir; } public virtual Uri SiteUri { get; definir; } public ICollection Postagens { get; }}
public class Post{ public int Id { get; definir; } public string Title { get; definir; } public string Content { get; definir; } public DateTime PublishedOn { get; definir; } public bool Arquivado { get; definir; } public int BlogId { get; definir; } Public Blog Blog { obter; definir; }}

Dica

As propriedades de chave primária e estrangeira não precisam ser propriedades publicamente visíveis do tipo de entidade. No entanto, mesmo quando as propriedades estão ocultas, é importante reconhecer que elas ainda existem no modelo EF.

A propriedade da chave primária deblog,Blog.Id, e a propriedade de chave estrangeira dePublicar,Post.BlogId, pode então ser associado às referências ("navegações") entre os tipos de entidade (Postagens no blogePost.Blog). Isso é feito automaticamente pelo EF ao criar um relacionamento simples como este, mas também pode ser especificado explicitamente ao substituir oOnModelCreatingmétodo do seuDbContext. Por exemplo:

substituição protegida void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity() .HasMany(e => e.Posts) .WithOne(e => e.Blog) .HasForeignKey(e => e.BlogId) .HasPrincipalKey( e => e.Id);}

Agora, todas essas propriedades se comportarão de maneira coerente como uma representação de uma única relação entreblogePublicar.

Descubra mais

O EF oferece suporte a muitos tipos diferentes de relacionamentos, com muitas maneiras diferentes de representar e configurar esses relacionamentos. Para ver exemplos de diferentes tipos de relacionamentos, consulte:

  • Relacionamentos um-para-muitos, em que uma única entidade está associada a qualquer número de outras entidades.
  • Relacionamentos um-para-um, em que uma única entidade está associada a outra entidade única.
  • Relacionamentos muitos-para-muitos, em que qualquer número de entidades está associado a qualquer número de outras entidades.

Se você é novo no EF, tentar os exemplos vinculados nos pontos acima é uma boa maneira de ter uma ideia de como os relacionamentos funcionam.

Para se aprofundar nas propriedades dos tipos de entidade envolvidos no mapeamento de relacionamento, consulte:

  • Chaves estrangeiras e principais em relacionamentos, que aborda como as chaves estrangeiras são mapeadas para o banco de dados.
  • Navegações de relacionamento, que descreve como as navegações são colocadas em camadas sobre uma chave estrangeira para fornecer uma exibição orientada a objeto do relacionamento.

Os modelos do EF são criados usando uma combinação de três mecanismos: convenções, atributos de mapeamento e a API do construtor de modelos. A maioria dos exemplos mostra a API de construção de modelo. Para saber mais sobre outras opções, consulte:

  • Convenções de relacionamento, que descobrem tipos de entidade, suas propriedades e os relacionamentos entre os tipos.
  • Atributos de mapeamento de relacionamento, que pode ser usado como uma alternativa para a API de construção de modelo para alguns aspectos da configuração de relacionamento.

Importante

A API de construção de modelo é a fonte final de verdade para o modelo EF--ela sempre tem precedência sobre a configuração descoberta por convenção ou especificada por atributos de mapeamento. É também o único mecanismo com total fidelidade para configurar todos os aspectos do modelo EF.

Outros tópicos relacionados a relacionamentos incluem:

  • Exclusões em cascata, que descrevem como as entidades relacionadas podem ser excluídas automaticamente quandoSalvar alteraçõesouSaveChangesAsyncé chamado.
  • Tipos de entidades própriasusam um tipo especial de relacionamento de "propriedade" que implica uma conexão mais forte entre os dois tipos do que os relacionamentos "normais" discutidos aqui. Muitos dos conceitos descritos aqui para relacionamentos normais são transferidos para relacionamentos de propriedade. No entanto, os relacionamentos de propriedade também têm seus próprios comportamentos especiais.

Dica

Consulte oglossário de termos de relacionamentoconforme necessário ao ler a documentação para ajudar a entender a terminologia usada.

Usando relacionamentos

Os relacionamentos definidos no modelo podem ser usados ​​de várias maneiras. Por exemplo:

  • Os relacionamentos podem ser usados ​​paraconsultar dados relacionadosem qualquer uma das três maneiras:
    • ansiosamentecomo parte de uma consulta LINQ, usandoIncluir.
    • Preguiçosamenteusando proxies de carregamento lento ou carregamento lento sem proxies.
    • Explicitamenteusando oCarregarouLoadAsyncmétodos.
  • Os relacionamentos podem ser usados ​​emsemeadura de dadosatravés da correspondência de valores PK para valores FK.
  • Os relacionamentos podem ser usados ​​paragráficos de rastreamento de entidades. Os relacionamentos são usados ​​pelo rastreador de alterações para:
    • Detecte mudanças nos relacionamentos e execute correções
    • Enviar atualizações de chave estrangeira para o banco de dadoscomSalvar alteraçõesouSaveChangesAsync
Introdução aos relacionamentos - EF Core (2024)

FAQs

O que é propriedade de navegação? ›

Uma propriedade de navegação é uma propriedade opcional em um tipo de entidade que permite a navegação de uma extremidade de uma associação à outra. Ao contrário das outras propriedades, as propriedades de navegação não levam dados.

Porquê usar Entity Framework Core? ›

Ele me dá toda produtividade que preciso, já que o Backoffice é acessado por 3~5 usuários apenas. Além disso a integração do Visual Studio com o Entity Framework Core me permite gerar telas de forma automática, poupando ainda mais tempo.

O que é o DbContext? ›

DbContext é conceitualmente semelhante a ObjectContext. Uma instância DbContext representa uma combinação dos padrões de Unidade de Trabalho e Repositório, de modo que ela possa ser usada para consultar de um banco de dados e agrupar alterações que serão gravadas novamente no repositório como uma unidade.

References

Top Articles
Latest Posts
Article information

Author: Fredrick Kertzmann

Last Updated:

Views: 5877

Rating: 4.6 / 5 (46 voted)

Reviews: 85% of readers found this page helpful

Author information

Name: Fredrick Kertzmann

Birthday: 2000-04-29

Address: Apt. 203 613 Huels Gateway, Ralphtown, LA 40204

Phone: +2135150832870

Job: Regional Design Producer

Hobby: Nordic skating, Lacemaking, Mountain biking, Rowing, Gardening, Water sports, role-playing games

Introduction: My name is Fredrick Kertzmann, I am a gleaming, encouraging, inexpensive, thankful, tender, quaint, precious person who loves writing and wants to share my knowledge and understanding with you.