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
のクエリが原因です。これに対する解決策はありますか?
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
AsNoTracking()
が役立ちます。
updatedEntity.Id
の値を確認してください。ゼロの場合は、以下のコードを使用してください。
var updatedEntity = ObjectMapper.Map<Product>(input);
updatedEntity.Id = input.Id; //set Id manually
var entity = await _productRepository.UpdateAsync(updatedEntity);