You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决EF Core“实体无法被跟踪”错误:同主键实体插入问题

解决EF Core插入时"Entity cannot be tracked because same instance"错误

实体defectmelmaster与defectmeleffectivity具有相似的主键结构。构建好两个实体列表后,先调用defectmelmaster的AddRangeAsync插入成功,但执行defectmeleffectivity的AddRangeAsync时抛出错误:

Entity cannot be tracked because same instance ...

相关代码

Service.cs 构建列表并调用仓储插入

foreach (var val in entities)
{
      var defectMelMasterQuery = FormatDefectMelMasterQuery(val, userRegisterId);
      var defectMelEffectivityQuery = FormatDefectMelEffectivityQuery(val, userRegisterId);
}
           
defectMelMasterQueryList.Add(defectMelMasterQuery);
defectMelEffectivityQueryList.Add(defectMelEffectivityQuery);

await _defectMelMasterRepository.InsertDefectMelMaster(defectMelMasterQueryList, cancellationToken);
await _defectMelEffectivityRepo.InsertDefectMelEffectivity(defectMelEffectivityQueryList, cancellationToken); //抛出错误

DefectMelEffectivityRepo.cs 执行插入的代码

//DefectMelEffectivityRepo

await _dbContext.Set<DefectMelEffectivity>().
            AddRangeAsync(defectMelEffectivityQueryList, cancellationToken);

await _dbContext.SaveChangesAsync(cancellationToken);

DefectMelEffectivity 实体配置

public void Configure(EntityTypeBuilder<DefectMelEffectivity> builder)
{
    builder.ToTable("DEFECT_MEL_EFFECTIVITY", schema: "XXX");
    
    builder.Ignore(x => x.Id);
    
    builder.HasKey(f => new {f.AcType, f.AcSeries, 
        f.MelNumber, f.MelSub, f.Ac, f.Company});
}

DefectMelMaster 实体配置

public void Configure(EntityTypeBuilder<DefectMelMaster> builder)
{
    builder.ToTable("DEFECT_MEL_MASTER", schema: "XXX");
    builder.Ignore(x => x.Id);
    builder.HasKey(f => new {f.AcType, f.AcSeries, 
        f.MelNumber, f.MelSub, f.Company});
}

解决方法

  • 排查重复实体实例:检查defectMelEffectivityQueryList是否存在重复的对象引用。可以按主键字段去重后再插入:

    var uniqueEffectivityList = defectMelEffectivityQueryList
        .GroupBy(e => new { e.AcType, e.AcSeries, e.MelNumber, e.MelSub, e.Ac, e.Company })
        .Select(g => g.First())
        .ToList();
    
    await _defectMelEffectivityRepo.InsertDefectMelEffectivity(uniqueEffectivityList, cancellationToken);
    
  • 清空上下文跟踪状态:如果两个仓储共享同一个DbContext,插入第一个列表后清空跟踪,避免残留实例干扰后续操作:

    await _defectMelMasterRepository.InsertDefectMelMaster(defectMelMasterQueryList, cancellationToken);
    _dbContext.ChangeTracker.Clear();
    await _defectMelEffectivityRepo.InsertDefectMelEffectivity(defectMelEffectivityQueryList, cancellationToken);
    
  • 检查实体构造逻辑:确认FormatDefectMelEffectivityQuery方法是否创建了全新的DefectMelEffectivity实例,没有复用已被跟踪的其他实体引用。

  • 临时使用无跟踪插入:如果不需要后续跟踪实体,可修改插入逻辑强制设置状态:

    // 在DefectMelEffectivityRepo的插入方法中调整
    _dbContext.Set<DefectMelEffectivity>().AddRange(defectMelEffectivityQueryList);
    foreach (var entry in _dbContext.ChangeTracker.Entries<DefectMelEffectivity>())
    {
        entry.State = EntityState.Added;
    }
    await _dbContext.SaveChangesAsync(cancellationToken);
    

内容的提问来源于stack exchange,提问作者Begumm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:52:39