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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:36:04