解决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
相关产品推荐
相关产品推荐

