Linq EF6 从列表向表添加多列数据时跳过偶数行问题如何解决
问题根源
你遇到的行重复、偶数行缺失问题,核心是视图中动态生成的SNumber是不稳定的:ROW_NUMBER()生成的行号依赖查询时的排序逻辑和基础表的实时数据,只要itemsToUpdate对应的IQueryable被多次枚举、或者EF查询排序和视图行号排序逻辑不一致,两次查询生成的行号就会错位,最终导致插入数据异常。
解决方案按优先级可选:
1. 最稳定方案:将SNumber改为物理存储字段
直接在LearnersOld表中新增物理存储的SNumber列,按照业务规则生成固定值(比如设为自增列、或者按业务编码规则生成后写入),视图直接读取该物理字段即可,完全避免动态生成行号的不稳定问题。
2. 若必须保留视图动态生成SNumber逻辑,按以下步骤调整:
- 确保视图行号排序规则唯一且稳定,排序字段必须是唯一非空的(你当前用ID排序符合要求,注意不要加其他可能重复的排序字段)
-- 视图定义保持排序规则固定 ROW_NUMBER() OVER(ORDER BY dbo.LearnersOld.ID ASC) AS SNumber - 查询
itemsToUpdate时显式指定和视图完全一致的排序规则,避免EF自动生成的排序逻辑和视图冲突:// 拉取视图数据时显式按ID排序,和视图行号排序规则一致,且立即转List只查询一次 var itemsToUpdate = db.LearnersOldView.OrderBy(l => l.ID).Where(/* 你的过滤条件 */).ToList(); - 优化插入代码,避免IQueryable多次枚举触发多次视图查询:
var mylist = itemsToUpdate.Select(item => new { FirstName = item.FirstName, LastName = item.LastName, SNumber = item.SNumber }).ToList(); foreach (var item in mylist) { var notification = new NotificationOld { FirstName = item.FirstName, LastName = item.LastName, SNumber = item.SNumber }; db.NotificationOlds.Add(notification); } await db.SaveChangesAsync();
3. 额外校验
可以给NotificationOld表的SNumber字段加唯一约束,插入重复数据时会直接抛出异常,方便提前定位问题。
内容的提问来源于stack exchange,提问作者hncl
相关产品推荐
相关产品推荐

