无法跟踪实体类型“”的实例,因为已跟踪键值“{Id: 13}”的另一个实例

Ian*_*aut 2 repository-pattern entity-framework-core asp.net-core asp.net-core-webapi

我正在编写一个 API,需要访问实体的值并检查它是否已更改 (userChangedPairOrSingle)。

\n\n
public ActionResult<ProdutoFabricante> Put([FromBody] ProdutoFabricanteViewModel produtoFabricanteViewModel)\n    {\n        if (produtoFabricanteViewModel.Invalid)\n        {\n            return StatusCode(400, produtoFabricanteViewModel);\n        }\n\n        try\n        {\n            var actualProdutoFabricante = produtoFabricanteRepository.GetById(produtoFabricanteViewModel.Id);\n\n            if (produtoFabricanteService.userChangedPairOrSingle(produtoFabricanteViewModel, actualProdutoFabricante.Par))\n            {\n\n                if (produtoFabricanteService.produtoFabricanteHasItems(produtoFabricanteViewModel.Id))\n                {\n                    return StatusCode(400, new { Message = "N\xc3\xa3o \xc3\xa9 poss\xc3\xadvel alterar " });\n                }\n            }\n\n            actualProdutoFabricante = mapper.Map<ProdutoFabricante>(produtoFabricanteViewModel);\n\n\n            produtoFabricanteRepository.Update(actualProdutoFabricante);\n            return Ok(actualProdutoFabricante);\n        }\n        catch (Exception ex)\n        {\n            return StatusCode(500, (ex.Message, InnerException: ex.InnerException?.Message));\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,当我访问要更新的同一实体时,它会出现以下错误:

\n\n
\n

无法跟踪实体类型“ProdutoFabricante”的实例,因为已跟踪具有键值“{Id: 13}”的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。

\n
\n\n

我怎样才能避免这个错误?

\n

Chr*_*att 5

当您进行映射时,您将创建一个新实例(未跟踪),而不是更新现有实例(已跟踪)。相反,您需要执行以下操作:

mapper.Map(produtoFabricanteViewModel, actualProdutoFabricante);
Run Code Online (Sandbox Code Playgroud)

这将保留现有实例,并简单地更新其属性值。然后,EF 就可以了,因为该实例与跟踪的实例是同一实例。