web-dev-qa-db-fra.com

Impossible de suivre l'instance du type d'entité «Produit» car une autre instance avec la même valeur de clé est déjà suivie

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?

5
Edward

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
3
aaron

AsNoTracking() pourrait vous aider.

2
Yaina Villafañes

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);
0
vivek nuna