EF Core修改现有实体时误插入新实体问题求助
问题原因及解决办法
核心问题
你犯了一个直接的逻辑错误:在获取并修改实体后,调用了InsertAsync而不是更新方法。
InsertAsync会让EF Core把当前实体标记为Added(新增)状态,哪怕主键DocumentId已经存在于数据库,EF Core依然会执行插入操作,最终导致主键冲突错误。
解决步骤
替换插入方法为更新方法
把代码里的:await _purchaseRequestDocumentRepository.InsertAsync(purchaseRequestDocument);改成仓储对应的更新方法,比如:
await _purchaseRequestDocumentRepository.UpdateAsync(purchaseRequestDocument);确认仓储更新方法的实现
确保仓储的UpdateAsync内部是调用EF Core的DbContext.Update()方法,或者直接依赖EF的状态跟踪:public async Task UpdateAsync(PurchaseRequestDocument entity) { _dbContext.Update(entity); await _dbContext.SaveChangesAsync(); }另外,因为你是从数据库查询得到的实体,EF Core默认会跟踪它的状态。当你用AutoMapper修改实体属性后,EF Core会自动把实体状态改为
Modified,这种情况下甚至不需要显式调用Update,直接调用SaveChangesAsync就能触发更新:// 如果仓储有单独的SaveChanges方法 await _purchaseRequestDocumentRepository.SaveChangesAsync();验证主键配置
你的PurchaseRequestDocumentConfiguration里已经设置了DocumentId为非自动生成主键(ValueGeneratedNever()),这个配置是正确的,不需要修改,确保EF Core不会自动生成主键值。
内容的提问来源于stack exchange,提问作者Emil Abbas
相关产品推荐
相关产品推荐

