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

EF更新数据库报错:ObjectStateManager中已存在相同键的未更改对象

问题分析与解决

错误原因

你遇到的错误ObjectStateManager中已存在具有相同键的对象,现有对象处于Unchanged状态,根源在于:当你从数据库查询到olateBatchInfo对象时,这个对象已经被EF的上下文(dataContext)跟踪了,此时再调用dataContext.AddToCTRL_OPTION(olateBatchInfo),会尝试把一个已被跟踪的对象重新加入上下文,直接触发键冲突。

另外你的代码完全没对对象属性赋值,这也是更新没效果的核心原因——你根本没把传入的参数值写到对象里。

修复后的代码

public static object SetLateBatchInfo(bool chkEnable, int numThreshold, int numRepeatDays)
{
    string returnstring = "true";
    try
    {
        using (var dataContext = new SOSEntities())
        {
            var olateBatchInfo = dataContext.CTRL_OPTION.Where(x => x.OPTION_NAME.Contains("LATE")).FirstOrDefault();
            
            if (olateBatchInfo == null)
            {
                // 仅当数据库无对应记录时,才创建新对象并添加到上下文
                olateBatchInfo = new CTRL_OPTION();
                // 注意:新对象需设置主键/唯一标识字段(根据你的表结构调整)
                olateBatchInfo.OPTION_NAME = "LATE_BATCH_CONFIG"; 
                dataContext.AddToCTRL_OPTION(olateBatchInfo);
            }
            
            // 给对象赋值,这才是更新/新增的核心操作
            olateBatchInfo.LATE_BATCH_EMAILS_ACTIVE = chkEnable;
            olateBatchInfo.LATE_BATCH_THRESHOLD_DAYS = numThreshold;
            olateBatchInfo.LATE_BATCH_REPEAT_DAYS = numRepeatDays;

            dataContext.SaveChanges();
        }
    }
    catch (Exception e)
    {
        returnstring = e.Message;
    }
    return returnstring;
}

关键改动说明

  • 将AddToCTRL_OPTION移到if (olateBatchInfo == null)分支内,仅新增对象时执行添加操作
  • 补充属性赋值逻辑,把传入的参数值写入对象对应字段
  • 新增对象时需设置主键/唯一标识字段(根据实际表结构调整),避免保存时出现主键缺失错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:57:09