Экземпляр типа объекта "Продукт" не может быть отслежен, поскольку другой экземпляр с таким же значением ключа уже отслеживается.

Я провел тест с приведенным ниже кодом, чтобы обновить 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);

Но это вызывает исключение:

Mvc.ExceptionHandling.AbpExceptionFilter - экземпляр типа сущности «Продукт» не может быть отслежен, поскольку другой экземпляр с таким же значением ключа для {'Id'} уже отслеживается. При присоединении существующих сущностей убедитесь, что присоединен только один экземпляр сущности с заданным значением ключа.

Это вызвано запросом existing. Есть ли решение для этого?


person Edward    schedule 12.04.2018    source источник


Ответы (4)


Поскольку вы не используете объект existing, не загружайте его.

Используйте AnyAsync, чтобы проверить, существует ли он:

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

Если вы хотите сопоставить с сущностью 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
person aaron    schedule 12.04.2018
comment
Я решил var updatedEntity = ObjectMapper.Map(input, existing); - person Edward; 12.04.2018

AsNoTracking() может вам помочь.

person Yaina Villafañes    schedule 20.04.2018

Проверьте значение updatedEntity.Id, если оно равно нулю, используйте приведенный ниже код.

var updatedEntity = ObjectMapper.Map<Product>(input);
updatedEntity.Id = input.Id; //set Id manually
var entity = await _productRepository.UpdateAsync(updatedEntity);
person vivek nuna    schedule 12.04.2018

добавить код для отсоединения

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

person Niang Moore    schedule 01.11.2020
comment
В этом случае EntityState уже отсоединен. - person Amit; 05.06.2021