zoukankan      html  css  js  c++  java
  • EF ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象

    今天编码过程中遇到这个问题,用EF 更新数据库,将组织好的数据传递到ef的上下文中,本以为附加上去更新,一切就ok了,不过事实证明没这么顺利

      ---------------------------------------------
    
    ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象
    
      ---------------------------------------------

    看了很多博文,总结原因是当前上下文中已经包含了这一条记录,而且是出于被跟踪状态,所以不能再附加具有相同键的对象

     
    很多人都遇到了这个问题,各有各的解决办法,在这个链接博文的启发下,因为需求不同故做了一点小小修改;山人自有妙计
    找到了一个相似的解决方案

    记录一下我自己的情况的解决方案:
     //update
            public virtual bool Update(T entity)
            {
                //子类重写
                return true;
            }
    
    

    将BaseDal 中实现 接口 Update 的方法变成虚方法,然后让每一个子类去重写这个方法(如下);

     public override bool Update(LYMX lymx)
            {
                var entity = datamodelcontainer.Set<LYMX>().Find(lymx.ZSGBH);
                if (entity != null)
                {
                    datamodelcontainer.Entry<LYMX>(entity).State = System.Data.EntityState.Detached; //这个是在同一个上下文能修改的关键
                }
                // 组织需要的数据
                entity.RCBABH = lymx.RCBABH;
                entity.ZSZT = lymx.ZSZT;
                entity.GXSJ = DateTime.Now;
    
                datamodelcontainer.Set<LYMX>().Attach(entity);
                datamodelcontainer.Entry(entity).State = EntityState.Modified;
                return true; //datamodelcontainer.SaveChanges() > 0;
            }

    首先通过lymx 的逐渐,取得上下文中的这一条记录,将状态修改成“System.Data.EntityState.Detached” 而后组织数据,附加到上下文,进行更新.





  • 相关阅读:
    JS判断是PC端还是移动端
    js对象转数组
    js获取当前域名、Url、相对路径和参数以及指定参数
    javascript返回上一页的三种写法
    js正则归纳总结
    higtcharts 生成图表个数问题
    js如何处理后台传递过来的Map
    jQuey实现鼠标滑过整行变色
    <display:column>常用属性解释
    <display:table>常用属性解释
  • 原文地址:https://www.cnblogs.com/wzalex/p/3315614.html
Copyright © 2011-2022 走看看