如何解决C#中查询多条数据却重复存储同一条至数据库表的问题
解决数据重复插入的问题
可能的原因及排查步骤
1. 源数据本身重复
先确认premArrearsGet中的3条数据的REG_NUMBER和AUTO_NUMBER是否真的不同:
- 在断点处展开
premArrearsGet的每个元素,查看这两个属性的具体值。如果3条数据的这两个属性完全一致,那么插入重复数据是预期行为,需要重新检查查询条件Where(e => e.REG_NUMBER == REG_NUMBER_PL)是否正确筛选出了不同的记录。
2. 实体属性映射错误
检查prem_arrears_pl实体的配置:
- 确认
AUTO_NUMBER和REG_NUMBER没有被配置为自增列(比如使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]特性),否则你手动赋值的属性值会被数据库的自增逻辑覆盖,导致插入的数据不符合预期。 - 验证实体属性与数据库列的映射关系,确保没有出现属性映射到错误列的情况(比如两个属性映射到同一列)。
3. 代码调试与验证
修改代码添加日志输出,确认循环中每个实体的赋值是否正确:
var premArrearsGet = await _autoLISContext.PremArrears.Where(e => e.REG_NUMBER == REG_NUMBER_PL).ToListAsync(); foreach (var premArrearsItem in premArrearsGet) { // 添加日志输出,确认当前迭代的属性值 Console.WriteLine($"当前item: REG_NUMBER={premArrearsItem.REG_NUMBER}, AUTO_NUMBER={premArrearsItem.AUTO_NUMBER}"); var newEntity = new prem_arrears_pl { REG_NUMBER = premArrearsItem.REG_NUMBER, AUTO_NUMBER = premArrearsItem.AUTO_NUMBER, }; // 验证新实体的属性值 Console.WriteLine($"新实体: REG_NUMBER={newEntity.REG_NUMBER}, AUTO_NUMBER={newEntity.AUTO_NUMBER}"); _context.PremArrearsPL.Add(newEntity); } await _context.SaveChangesAsync();
运行后查看日志,如果输出的每个newEntity的属性值都是第一条数据的值,说明premArrearsGet的数据源确实存在重复,或者查询逻辑有问题。
4. 上下文状态检查
确认_context没有被意外复用或者存在状态跟踪异常:
- 可以尝试在循环中使用全新的上下文实例(仅用于测试),看是否还会出现重复插入的情况:
using(var tempContext = new YourDbContext()) { foreach (var premArrearsItem in premArrearsGet) { var newEntity = new prem_arrears_pl { REG_NUMBER = premArrearsItem.REG_NUMBER, AUTO_NUMBER = premArrearsItem.AUTO_NUMBER, }; tempContext.PremArrearsPL.Add(newEntity); } await tempContext.SaveChangesAsync(); }
如果使用临时上下文后问题解决,说明原_context存在状态管理的异常(比如之前的实体跟踪导致重复添加)。
内容的提问来源于stack exchange,提问作者Cyrus Yabut
相关产品推荐
相关产品推荐

