一个实体对象不能由多个 IEntityChangeTracker 实例引用
错误:一个实体对象不能由多个 IEntityChangeTracker 实例引用
原因:
之前的代码:db.T_DeviceVarDataCurrent.Add(current);
SaveChanges执行后current对象中的一些值(或引用)会发生改变,导致catch 中obj发生改变。
修改:try中list不参与数据库操作,或者catch中重新赋值给新对象current2。
如下:
/// <summary> /// 最新数据 /// </summary> /// <param name="str"></param> /// <param name="minuteInterval"></param> public void AddDeviceVarDataCurrent( string str) { var waterSensor = JsonConvert.DeserializeObject<WaterSensorRealTimeModel>(str); if (waterSensor.CP != null && waterSensor.CP.data != null && waterSensor.CP.data.Count() > 0) { //如果不报错,一下插入多条。 using ( var db = new FarmSensorDataWaterEntities()) { var tran = db.Database.BeginTransaction(); //开启事务 var list = new List<T_DeviceVarDataCurrent>() { }; var nowTime = DateTime.Now; try { var varList = db.T_Var.ToList(); var deviceList= db.T_Device.ToList(); var varTypeList = db.T_VarType.ToList(); var deviceVarList = db.T_DeviceVar.ToList(); foreach ( var item in waterSensor.CP.data) { var dateTime = GetDateTime(item.SampleTime); //如果是正常值 if (item.Flag == "N" && dateTime != null ) { var varId = varList.Where(d => d.Tag == item.code).Select(d => d.VarID).SingleOrDefault(); var deviceId = deviceList.Where(d => d.Tag == waterSensor.MN&& d.ProviderID==1).Select(d => d.DeviceID).SingleOrDefault(); //中科山东东营地理研究院 var typeList = varTypeList.Where(d => d.TypeID ==1).ToList(); // 实时值 if (varId != 0 && deviceId != 0) { foreach ( var type in typeList) { var deviceVarID = deviceVarList.Where(d => d.VarID == varId && d.DeviceID == deviceId && d.TypeID == type.TypeID).Select(d => d.DeviceVarID).SingleOrDefault(); if (deviceVarID != 0) { //存储list var current = new T_DeviceVarDataCurrent { DeviceVarID = deviceVarID, Value = item.Rtd, VarDate = (DateTime)dateTime, UpdateTime = nowTime, }; list.Add(current); var currentInfo = db.T_DeviceVarDataCurrent.Where(d => d.DeviceVarID == deviceVarID).SingleOrDefault(); if (currentInfo != null ) { //修改 //currentInfo.Value = item.Rtd; //currentInfo.VarDate = (DateTime)dateTime; //currentInfo.UpdateTime = nowTime; currentInfo.Value = current.Value; currentInfo.VarDate = current.VarDate; currentInfo.UpdateTime = current.UpdateTime; } else { //添加 var current2 = new T_DeviceVarDataCurrent { DeviceVarID = deviceVarID, Value = item.Rtd, VarDate = (DateTime)dateTime, UpdateTime = nowTime, }; db.T_DeviceVarDataCurrent.Add(current2); } } } } } } if (list.Count > 0) { db.SaveChanges(); //必须调用Commit(),不然数据不会保存 tran.Commit(); } } catch (Exception ex) { tran.Rollback(); //出错就回滚 while (ex.InnerException != null ) { ex = ex.InnerException; } LogManage.Error(ex); //若重复错误,则逐条遍历。 if (ex.Message.Contains( "IX_" )) { foreach ( var obj in list) { try { using ( var db2 = new FarmSensorDataWaterEntities()) { var currentInfo = db2.T_DeviceVarDataCurrent.Where(d => d.DeviceVarID == obj.DeviceVarID).SingleOrDefault(); if (currentInfo != null ) { currentInfo.Value = obj.Value; currentInfo.VarDate = obj.VarDate; currentInfo.UpdateTime = nowTime; } else { var current = new T_DeviceVarDataCurrent { DeviceVarID = obj.DeviceVarID, Value = obj.Value, VarDate = obj.VarDate, UpdateTime = obj.UpdateTime, }; db2.T_DeviceVarDataCurrent.Add(current); } db2.SaveChanges(); } } catch (Exception ex2) { //LogManage.Error(ex2); } } } } } } } |
树立目标,保持活力,gogogo!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2019-03-07 windows server 2012/2016 设置多用户远程桌面(转载)
2019-03-07 用IIS管理器 发布 web应用程序
2018-03-07 数组 复制 拷贝 相等判断
2018-03-07 JS forEach()与map() 用法(转载)