The instance of entity type 'Product' cannot be tracked because another instance with the same key value is already being tracked
Asked Answered
V

4

9

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?

Viens answered 12/4, 2018 at 13:58 Comment(0)
N
10

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
Nagano answered 12/4, 2018 at 14:21 Comment(0)
L
7

AsNoTracking() could help you.

Lorca answered 20/4, 2018 at 13:3 Comment(0)
K
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);
Karame answered 12/4, 2018 at 14:6 Comment(0)
T
-1

add code for detaching

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

Tennison answered 1/11, 2020 at 21:26 Comment(1)
The EntityState is already detached in this case.Thirtythree

© 2022 - 2024 — McMap. All rights reserved.