web-dev-qa-db-ja.com

エンティティタイプ「Product」のインスタンスは追跡できません。同じキー値を持つ別のインスタンスがすでに追跡されているためです

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'}の同じキー値を持つ別のインスタンスがすでに追跡されているため、エンティティタイプ「Product」のインスタンスを追跡できません。既存のエンティティをアタッチする場合は、特定のキー値を持つエンティティインスタンスが1つだけアタッチされるようにしてください。

これは、existingのクエリが原因です。これに対する解決策はありますか?

5
Edward

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
aaron

AsNoTracking()が役立ちます。

2

updatedEntity.Idの値を確認してください。ゼロの場合は、以下のコードを使用してください。

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