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

如何用Linq在单条语句中完成查询与赋值?现有更新代码不生效是何原因

问题分析

你的实现存在多个风险点,是导致数据未实际更新的核心原因:

  • 空引用隐患:FirstOrDefault() 在没有找到匹配 MyName == row.TheirName 的记录时会返回null,此时直接访问 .MyPrice 会触发空引用异常。你反馈运行无报错,要么是所有名称刚好匹配,要么是上层代码捕获了异常未抛出,该写法本身存在稳定性缺陷。
  • 实体追踪失效:如果你的 Items 实体配置了全局无跟踪查询(AsNoTracking),上下文不会感知到你对实体属性的修改,SaveChanges 自然不会生成对应的更新语句。
  • 环境配置错误:存在你连接的数据库和你校验的数据库不是同一个、事务未提交等低级问题的可能。

修正后的实现方案

DbModels db = new DbModels();
int matchedCount = 0;
foreach (var row in PriceCheckList)
{
    var targetItem = db.Items.FirstOrDefault(i => i.MyName == row.TheirName);
    if (targetItem != null)
    {
        targetItem.MyPrice = row.TheirPrice;
        matchedCount++;
        // 若确认实体未被上下文追踪,可手动标记为修改状态
        // db.Entry(targetItem).State = System.Data.Entity.EntityState.Modified;
    }
}
// 输出实际受影响行数,方便排查问题
int affectedRows = db.SaveChanges();
Console.WriteLine($"匹配到的待更新条目:{matchedCount},数据库实际更新行数:{affectedRows}");

额外排查建议

  • 开启EF的SQL日志输出,确认 SaveChanges 执行时是否生成了对应的UPDATE语句,快速定位是EF未感知变更,还是SQL执行后未生效
  • 检查数据库连接字符串配置,确认更新操作命中的是你预期的目标库
  • 确认代码没有运行在未提交的事务上下文中,避免变更被隐式回滚

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:06:04