首页 文章

无法跟踪实体类型'Product'的实例,因为已经跟踪了具有相同键值的另一个实例

提问于
浏览
1

我用下面的代码进行了测试以更新 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 - 无法跟踪实体类型“Product”的实例,因为已经跟踪了另一个具有{'Id'}键值的实例 . 附加现有实体时,请确保仅附加具有给定键值的一个实体实例 .

这是由查询 existing 引起的 . 这有什么解决方案吗?

3 回答

  • 0

    由于您未使用 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
    
  • 3

    AsNoTracking() 可以帮到你 .

  • 2

    检查 updatedEntity.Id 的值,如果它为零则使用下面的代码 .

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

相关问题