6

I made a test with code below to update the 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);

But it throws an exception:

Mvc.ExceptionHandling.AbpExceptionFilter - The instance of entity type 'Product' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached.

This is caused by querying existing. Is there any solution for this?

aaron
  • 17,311
  • 4
  • 27
  • 63
Edward
  • 22,080
  • 7
  • 44
  • 80

4 Answers4

8

Since you are not using the existing entity, don't load it.

Use AnyAsync to check if it exists:

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);

If you want to map to the existing entity:

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
aaron
  • 17,311
  • 4
  • 27
  • 63
6

AsNoTracking() could help you.

Irvin Dominin
  • 29,799
  • 9
  • 75
  • 107
0

Check the value of updatedEntity.Id, if it's zero then use the below code.

var updatedEntity = ObjectMapper.Map<Product>(input);
updatedEntity.Id = input.Id; //set Id manually
var entity = await _productRepository.UpdateAsync(updatedEntity);
vivek nuna
  • 12,695
  • 7
  • 48
  • 123
-1

add code for detaching

_dbcontext.Entry(oldEntity).State = EntityState.Detached;

Niang Moore
  • 418
  • 3
  • 13