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

