8

我用下面的代码做了一个测试来更新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。有什么解决办法吗?

4

4 回答 4

9

由于您没有使用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
于 2018-04-12T14:21:21.140 回答
7

AsNoTracking()可以帮助你。

于 2018-04-20T13:03:38.637 回答
0

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

var updatedEntity = ObjectMapper.Map<Product>(input);
updatedEntity.Id = input.Id; //set Id manually
var entity = await _productRepository.UpdateAsync(updatedEntity);
于 2018-04-12T14:06:48.387 回答
-1

添加分离代码

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

于 2020-11-01T21:26:36.110 回答