Estoy escribiendo una API que necesita acceder al valor de una entidad y verificar si ha cambiado (userChangedPairOrSingle).
public ActionResult<ProdutoFabricante> Put([FromBody] ProdutoFabricanteViewModel produtoFabricanteViewModel)
{
if (produtoFabricanteViewModel.Invalid)
{
return StatusCode(400, produtoFabricanteViewModel);
}
try
{
var actualProdutoFabricante = produtoFabricanteRepository.GetById(produtoFabricanteViewModel.Id);
if (produtoFabricanteService.userChangedPairOrSingle(produtoFabricanteViewModel, actualProdutoFabricante.Par))
{
if (produtoFabricanteService.produtoFabricanteHasItems(produtoFabricanteViewModel.Id))
{
return StatusCode(400, new { Message = "Não é possÃvel alterar " });
}
}
actualProdutoFabricante = mapper.Map<ProdutoFabricante>(produtoFabricanteViewModel);
produtoFabricanteRepository.Update(actualProdutoFabricante);
return Ok(actualProdutoFabricante);
}
catch (Exception ex)
{
return StatusCode(500, (ex.Message, InnerException: ex.InnerException?.Message));
}
}
Pero cuando accedo a la misma entidad que voy a actualizar, me da el siguiente error:
La instancia del tipo de entidad 'ProdutoFabricante' no se puede rastrear porque ya se está rastreando otra instancia con el valor clave '{Id: 13}'. Al adjuntar entidades existentes, asegúrese de que solo se adjunte una instancia de entidad con un valor clave dado.
¿Cómo puedo evitar este error?
Cuando está asignando, está creando una nueva instancia (que no se rastrea) en lugar de actualizar la instancia existente (que se rastrea). En cambio, debes hacer:
mapper.Map(produtoFabricanteViewModel, actualProdutoFabricante);
Eso mantendrá la instancia existente y simplemente actualizará los valores de propiedad en ella. Entonces, EF estará bien, porque esta instancia es la misma que se rastrea.