Nesta aula o professor implementa o método OnModelCreating. No meu projeto ele já estava implementado de aulas anteriores, então inclui as duas novas linhas dentro do meu método (as duas últimas). Apareceu o erro abaixo.
Nesta aula o professor implementa o método OnModelCreating. No meu projeto ele já estava implementado de aulas anteriores, então inclui as duas novas linhas dentro do meu método (as duas últimas). Apareceu o erro abaixo.
Olá Carlos! Tudo bem?
O erro indica que não foi possível encontrar o método de extensão HasMany
para o tipo de argumento que você está passando. Vamos revisar os passos para garantir que tudo esteja correto:
Verifique as Propriedades Virtuais: Certifique-se de que as propriedades Generos
em Musica
e Musicas
em Genero
estão definidas como virtual ICollection<>
.
public virtual ICollection<Genero> Generos { get; set; }
public virtual ICollection<Musica> Musicas { get; set; }
Revisão do Método OnModelCreating: No método OnModelCreating
, certifique-se de que a configuração do relacionamento muitos-para-muitos está correta.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Musica>()
.HasMany(m => m.Generos)
.WithMany(g => g.Musicas);
}
Usings Necessários: Verifique se você tem todos os using
necessários no início do arquivo, especialmente para o Entity Framework Core.
using Microsoft.EntityFrameworkCore;
Se ainda assim o erro persistir, pode ser útil que você compartilhe o seu projeto para que eu possa fazer testes para identificar o problema.
Espero ter ajudado e bons estudos!
Olá Armano, fiz os passos acima mas o erro continua. Segue o link do meu projeto. Obrigado.
Bom dia, Carlos! Peço perdão pela demora em responder.
Esse erro está acontecendo porque você está encadeando o método .HasMany()
depois de configurar o relacionamento HasOne/WithMany
, o que não é permitido.
O método:
modelBuilder.Entity<Musica>()
.HasOne(m => m.Artista)
.WithMany(a => a.Musicas)
Retorna um ReferenceCollectionBuilder<Artista, Musica>
, que não tem o método .HasMany()
. Ou seja, você não pode encadear HasMany()
logo após configurar esse relacionamento.
Não sei ao certo de onde vem essa implementação que já estava antes da que foi adicionada durante essa aula, mas para o desenvolver do projeto é necessário apenas essas duas chamadas:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Musica>()
.HasMany(c => c.Generos)
.WithMany(c => c.Musicas);
}
Mas caso queria manter elas no projeto, você deve separar os dois relacionamentos. Faça assim:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Musica>()
.HasOne(m => m.Artista)
.WithMany(a => a.Musicas)
.HasForeignKey(m => m.ArtistaId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<Musica>()
.HasMany(m => m.Generos)
.WithMany(g => g.Musicas);
}
Assim, cada relacionamento fica claro e independente, e o erro CS1061 desaparece.
Fico à disposição.