Vamos detalhar o funcionamento do seu código para entender se ele lida corretamente com a atualização de entidades, e se o Entity Framework Core (EF Core) irá refletir essas mudanças no banco de dados.
Contexto do Código
Estamos utilizando um método chamado GeneroRequestValidateExist
para verificar se os gêneros já existem no banco de dados e, se não, adicionar novos gêneros. Esse método é utilizado para configurar a propriedade Generos
de uma entidade Musica
quando você está manipulando uma requisição MusicaRequest
.
Função GeneroRequestValidateExist
private static ICollection<Genero> GeneroRequestValidateExist(ICollection<GeneroRequest> generosRequest, GenericDAL<Genero> dalGenero)
{
var listaDeGenerosUnicos = new List<Genero>(); // Inicializa uma lista vazia para armazenar os gêneros convertidos.
foreach (var generoRequest in generosRequest) // Itera sobre cada item da coleção de GeneroRequest.
{
var entity = GeneroRequestToEntity(generoRequest); // Converte GeneroRequest para a entidade Genero.
// Verifica se já existe um gênero no banco de dados com o mesmo nome (ignorando diferenças de maiúsculas/minúsculas).
var generoRecuperado = dalGenero.RecuperarObjPor(generoEntity => generoEntity.Nome.ToUpper().Equals(generoRequest.Nome.ToUpper()));
if (generoRecuperado is not null) // Se o gênero já existe no banco de dados...
{
listaDeGenerosUnicos.Add(generoRecuperado); // Adiciona o gênero recuperado à lista.
}
else // Se o gênero não existe no banco de dados...
{
listaDeGenerosUnicos.Add(entity); // Adiciona a nova entidade Genero à lista.
}
}
return listaDeGenerosUnicos; // Retorna a lista de gêneros convertidos.
}
Endpoint POST /Musicas
app.MapPost("/Musicas", ([FromServices] GenericDAL<Musica> dalMusica,
[FromServices] GenericDAL<Genero> dalGenero,
[FromBody] MusicaRequest musicaRequest) =>
{
var musicaObj = new Musica(musicaRequest.nome)
{
ArtistaId = musicaRequest.ArtistaId,
AnoLancamento = musicaRequest.anoLancamento,
Generos = musicaRequest.Generos is not null
? GeneroRequestValidateExist(musicaRequest.Generos, dalGenero)
: new List<Genero>()
};
dalMusica.Adicionar(musicaObj);
return Results.Created();
});
Análise do Fluxo de Atualização
Verificação e Conversão dos Gêneros:
- Para cada
GeneroRequest
, você verifica se o gênero já existe no banco de dados. - Se existe, você recupera e adiciona o gênero existente à lista.
- Se não existe, você converte o
GeneroRequest
para uma entidadeGenero
e adiciona à lista.
- Para cada
Associação dos Gêneros à Música:
- A lista resultante de gêneros é associada à propriedade
Generos
do objetoMusica
.
- A lista resultante de gêneros é associada à propriedade
Adição da Música ao Banco de Dados:
- Você adiciona o objeto
Musica
ao contexto do EF Core através do métodoAdicionar
deGenericDAL<Musica>
.
- Você adiciona o objeto
Atualização das Entidades
EF Core e Rastreamento de Mudanças:
- EF Core rastreia automaticamente as entidades que foram recuperadas do banco de dados e quaisquer alterações feitas nelas enquanto elas estão sendo rastreadas pelo contexto.
- Quando você chama
SaveChanges
, EF Core persiste todas as alterações rastreadas no banco de dados.
Adição de Gêneros Existentes:
- Se um gênero já existe, ele é recuperado e adicionado à lista de gêneros da música. EF Core irá detectar que não houve mudanças nesses objetos e não tentará adicioná-los novamente.
Adição de Novos Gêneros:
- Se um gênero não existe, ele é criado como uma nova entidade. Quando você chama
SaveChanges
, EF Core adicionará essa nova entidade ao banco de dados.
- Se um gênero não existe, ele é criado como uma nova entidade. Quando você chama
Resumo
- Validação e Conversão:
GeneroRequestValidateExist
verifica e converteGeneroRequest
em entidadesGenero
. - Rastreamento pelo EF Core: EF Core rastreia automaticamente as entidades recuperadas e persiste as alterações.
- Operações no Banco de Dados: Gêneros existentes são associados, e novos gêneros são adicionados ao banco de dados.