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

EF6清空表后添加新条目触发DbUpdateConcurrencyException问题求助

解决EF6中TRUNCATE表后添加实体触发并发错误的问题

这个问题的核心在于你调用_lisDatabase.sortedtubes.Local.Clear()的方式不对——直接清空Local集合会导致EF的ChangeTracker和数据库状态不一致,进而在后续SaveChanges()时触发那个“影响行数异常”。

为什么Local.Clear()会出问题?

EF的Local集合是DbSet在内存中的缓存视图,它和ChangeTracker紧密关联。当你调用Clear()时,只是把内存中的实体从这个集合里移除,但ChangeTracker可能还在追踪这些实体的状态。当你后续尝试新增实体并保存时,EF会检查ChangeTracker中的所有实体状态,发现原本追踪的实体在数据库里已经不存在(因为你TRUNCATE了),就会抛出并发错误。

正确的解决步骤

我们需要同时完成清空数据库表和同步清理EF的追踪状态两个操作,确保两者一致:

public void ResetStatistics()
{
    // 第一步:清空数据库表
    _lisDatabase.Database.ExecuteSqlCommand("TRUNCATE TABLE Sortedtubes");
    
    // 第二步:清理ChangeTracker中所有Sortedtubes实体的追踪状态
    var trackedTubes = _lisDatabase.ChangeTracker.Entries<Sortedtubes>().ToList();
    foreach (var entry in trackedTubes)
    {
        // 将实体标记为已脱离追踪,这样EF就不会再管它们了
        entry.State = System.Data.Entity.EntityState.Detached;
    }
}

为什么这个方法有效?

  • 当你把所有Sortedtubes实体的状态改为Detached后,EF的ChangeTracker会停止追踪这些实体,同时Local集合会自动清空(因为它只包含被追踪的实体)。
  • 你的GridView绑定的是sortedtubes实体的Local集合,所以Local清空后GridView会同步更新,完全满足你的需求。

额外说明

如果你之前尝试过官方文档的方案没解决,大概率是因为没处理好ChangeTracker的状态。这个方法直接从根源上切断了EF对旧实体的追踪,确保后续新增实体时,EF只会处理新的实体,不会再和已TRUNCATE的旧实体产生冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:19:00