Boa tarde, tudo bem? como na aula temos o cadastrar, deletar, pensei em fazer o atualizar(editar), e meu teste seria incluir um novo gênero que ficou faltando (teste adicionar o gênero rock), Ao realizar a edição tive alguns problemas que estava duplicando ao salvar o novo gênero a musica, para corrigir o duplicar e reparei que só enviava o nome do gênero e não o Id, por falta do id do gênero ao salvar os gêneros antigos, eram inseridos novamente nas tabelas:
- genero
- generomusica
Mudança no GeneroRequestEdit
// antes:
public record GeneroRequestEdit(string Nome, string Descricao)
{
}
// depois
public record GeneroRequestEdit(int id, string Nome, string Descricao)
{
}
Assim evitei a duplicidade, porem gerou outro erro que não sei resolver: *SqlException: Violation of PRIMARY KEY constraint 'PKGeneroMusica'. Cannot insert duplicate key in object 'dbo.GeneroMusica'. The duplicate key value is (2, 11). The statement has been terminated. *
**Se é update pq ele esta tentando inserir um registro que já existe? Musica do exemplo e erro = 11 - Lady Laura
Tabela Musicas:
Tabela Gêneros:
Tabela GeneroMusica
**esse é meu método put **
app.MapPut("/Musicas", ([FromServices] DAL<Musica> dal, [FromBody] Musica musica) =>
{
var musicaAAtualizar = dal.RecuperarPor(a => a.Id == musica.Id);
if (musicaAAtualizar is null)
{
return Results.NotFound();
}
// atualiza nome
musicaAAtualizar.Nome = musica.Nome;
// atualiza ano lancamento
musicaAAtualizar.AnoLancamento = musica.AnoLancamento;
// atualiza artista
musicaAAtualizar.ArtistaId = musica.ArtistaId;
musicaAAtualizar.Generos = musica.Generos.Select( a=>
new Genero()
{
Id = a.Id,
Nome = a.Nome,
Descricao = a.Descricao,
Musicas = a.Musicas
}
).ToList();
dal.Atualizar(musicaAAtualizar);
return Results.Ok();
});
#endregion
Na ultima tabela deveria apenas ser add (3, 11) e os outros (2,11),(5,11) apenas atualizar.
até posso fazer em meu put um filtro para manter só o que vier, de alteração, mas penso que o EF deveria saber como tratar um obj que tem listas, e ele mesmo atualizar... remover ou adiconar o que não esta em seu objeto virtual... (relacionado)