Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] Chave estrangeira

Por que não precisamos indicar a propriedade Id em Avalizações?

Context:

modelBuilder.Entity<AvaliacaoArtista>()
    .HasKey(c => new { c.ArtistaId, c.PessoaId });
    
    // Não deveria ser assim?
    modelBuilder.Entity<AvaliacaoArtista>()
    .HasKey(c => c.Id = new { c.ArtistaId, c.PessoaId });

Entidade:


using ScreenSound.Modelos;

namespace ScreenSound.Shared.Models.Models;

public class AvaliacaoArtista
{
    public int PessoaId { get; set; }
    public int ArtistaId { get; set; }
    public virtual Artista? Artista { get; set; }
    public int Nota { get; set; }

}
4 respostas

Oi Igor! Como vai?

A razão pela qual você não precisa indicar a propriedade Id na entidade AvaliacaoArtista é porque, nesse caso, a chave primária é composta por duas colunas: ArtistaId e PessoaId. Em sistemas onde a chave primária é composta, não é necessário ter uma propriedade Id separada.

No seu exemplo, ao definir a chave primária com HasKey(c => new { c.ArtistaId, c.PessoaId });, você está dizendo ao Entity Framework que a combinação dessas duas propriedades é única e serve como identificador para cada registro na tabela AvaliacaoArtistas. Isso é útil em cenários onde uma única coluna não é suficiente para identificar exclusivamente uma linha, como no caso de avaliações feitas por pessoas para artistas.

Se você tentasse usar HasKey(c => c.Id = new { c.ArtistaId, c.PessoaId });, isso geraria um erro, pois Id não é uma propriedade da entidade AvaliacaoArtista. Além disso, a sintaxe está incorreta, já que Id não pode ser atribuído dessa forma.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Então, ficaria assim?

Pelo que eu entendi, ele não tem uma propriedade Id, porque vai fazer dessas duas uma, certo?

 // Definindo a chave primária composta para a tabela de avaliação de artistas
     modelBuilder.Entity<AvaliacaoArtista>()
         .HasKey(c => new { c.ArtistaId, c.PessoaId });
solução!

Olá, Igor!

Isso mesmo, você entendeu corretamente. Não existe uma propriedade Id na entidade AvaliacaoArtista porque a chave primária é composta pelas propriedades ArtistaId e PessoaId. O Entity Framework usa a combinação desses dois campos para garantir a unicidade de cada avaliação.

Veja como a configuração fica de forma correta:


modelBuilder.Entity<AvaliacaoArtista>()
    .HasKey(c => new { c.ArtistaId, c.PessoaId });

Com isso, o banco de dados vai entender que cada combinação de ArtistaId e PessoaId representa uma avaliação única.

Fico à disposição.

Massa! Muito obrigado pela explicação.