首页 > 其他分享 >一个实体对象不能由多个 IEntityChangeTracker 实例引用

一个实体对象不能由多个 IEntityChangeTracker 实例引用

时间:2023-03-07 15:35:28浏览次数:37  
标签:obj db currentInfo Value current 实例 引用 var 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);
                                }
                            }
                       }
                    }
                }
            }
        }

  

 

标签:obj,db,currentInfo,Value,current,实例,引用,var,IEntityChangeTracker
From: https://www.cnblogs.com/hao-1234-1234/p/17188260.html

相关文章

  • 专利文献数据纠错实例分析
    摘要  本文详细介绍并分析了三个专利文献数据纠错的实际案例。案例从文献纠错的角度,运用文献知识判别文献错误、进行纠错过程分析,最终得出纠错结论。关键词纠错文献错......
  • Cisco-EIGRP的配置实例(Cisco的私有路由协议)
    什么时EIGRPEIGRP:EnhancedInteriorGatewayRoutingProtocol即增强内部网关路由协议。也翻译为加强型内部网关路由协议。EIGRP是Cisco公司的私有协议(2013年已经公有......
  • vue 组件的引用
       一:全局引用1,现在main中引用组件:import组件别名from'组件路径'2.注册组件Vue.component('组件别名',组件别名)  1.在需要引用组件的页面中script......
  • .Net引用Fo-Dicom 5.0 版本将Dicom转为图片时提示TransferSyntax不支持
    1.安装包fo-dicom.Codecsdotnetaddpackagefo-dicom.Codecs2.在应用程序启动前的初始化处注册服务newDicomSetupBuilder().RegisterServices((service)=>{ s......
  • 好文章!收藏了!————JS学习日志18 -- JS基础--对象引用和复制
                  参考:https://blog.csdn.net/Android_boom/article/details/125099640......
  • Vue实例挂载的过程中发生了什么?
    Vue实例挂载的过程中发生了什么?      根元素是不可以放在body或者html上的可以在对象中定义template/render或者直接使用template,el表示元素选择器......
  • jeroMQ操作ZMQ实例
    ZMQ即zeroMQ,ZMQ并不像是一个传统意义上的消息队列服务器,事实上,它也根本不是一个服务器,它更像是一个底层的网络通讯库,在SocketAPI之上做了一层封装,将网络通讯、进程通讯和......
  • C++--引用和函数调用
             ......
  • .net6 引用log4net记录日志
    第一步:nuget包引用使用log4net需要引用两个nuget包1.Log4net2.Microsoft.Extensions.Logging.Log4Net.AspNetCore第二步:引用log4net的config配置文件配置文件贴......
  • 初探富文本之CRDT协同实例
    初探富文本之CRDT协同实例在前边初探富文本之CRDT协同算法一文中我们探讨了为什么需要协同、分布式的最终一致性理论、偏序集与半格的概念、为什么需要有偏序关系、如何通......