J'ai fait un test avec le code ci-dessous pour mettre à jour le Product
:
var existing = await _productRepository.FirstOrDefaultAsync(c => c.Id == input.Id);
if (existing == null)
throw new UserFriendlyException(L("ProductNotExist"));
var updatedEntity = ObjectMapper.Map<Product>(input);
var entity = await _productRepository.UpdateAsync(updatedEntity);
Mais cela lève une exception:
Mvc.ExceptionHandling.AbpExceptionFilter - L'instance du type d'entité 'Product' ne peut pas être suivie car une autre instance avec la même valeur de clé pour {'Id'} est déjà suivie. Lorsque vous attachez des entités existantes, assurez-vous qu'une seule instance d'entité avec une valeur de clé donnée est attachée.
Cela est dû à l'interrogation de existing
. Existe-t-il une solution à ça?
Puisque vous n'utilisez pas l'entité existing
, ne la chargez pas.
Utilisez AnyAsync
pour vérifier s'il existe:
var exists = await _productRepository.GetAll().AnyAsync(c => c.Id == input.Id); // Change
if (!exists) // this
throw new UserFriendlyException(L("ProductNotExist"));
var updatedEntity = ObjectMapper.Map<Product>(input);
var entity = await _productRepository.UpdateAsync(updatedEntity);
Si vous souhaitez mapper à l'entité existing
:
var existing = await _productRepository.FirstOrDefaultAsync(c => c.Id == input.Id);
if (existing == null)
throw new UserFriendlyException(L("ProductNotExist"));
var updatedEntity = ObjectMapper.Map(input, existing); // Change this
AsNoTracking()
pourrait vous aider.
Vérifiez la valeur de updatedEntity.Id
, si c'est zéro, utilisez le code ci-dessous.
var updatedEntity = ObjectMapper.Map<Product>(input);
updatedEntity.Id = input.Id; //set Id manually
var entity = await _productRepository.UpdateAsync(updatedEntity);