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

原创 2013年12月03日 01:24:29

今天编码过程中遇到这个问题,在网上也查了一些所说的方式方法,但我不能使用,为什么这里面就不表述了

说重点吧。

我这个是这么理解的,出现这个问题应该是 ObjectContext 中被 attach 了几个相同的对象进去了。

所以在 context 中会出现至少两个主键一样的对象,所以这时EF被搞晕了。

我总结一下可能会解决的方法:

1. 

// 这句的意思是先把它从context 中分离出来, 这样就可以在上下文中操作了,是关键. 

this.context.Entry<sys_Company>(entry).State = System.Data.EntityState.Detached;
然后你可以继续 Attach/AttachTo

2. 你可以附加以前分离的对象、由 NoTracking 查询返回的对象或从对象上下文的外部获取的对象。
3. 第三种方法是对我的问题解决方法,我需要的是多张表的关联更新,一张主键表,多张外键表。
   其实很简单,就是先查,然后在更新~~~
   
	Company target = new Company();
	Mail.Model.Sys_Companys _company = target.DeleteCompanyModuleByCompanyID(C_ID);
        _company.C_Name = this.txt_CompanyName.Text.ToString();
        _company.C_Tel = this.txt_CompanyTel.Text.ToString();
        _company.C_Conatact = this.txt_CompanyConatact.Text.ToString();
        _company.C_Remark = this.txt_CompanyRemark.Text.ToString();
        Int32 iRow = 0;
        try
        {
             	UpdateCompanyModule(target, _company);
    		target.Update(_company, out iRow);// 这里你可以可以做你需要的更新了。
        }

	void UpdateCompanyModule(Company target, Sys_Companys _company)
    {
        //修改公司所有的模块
        string[] FieldChecked = FieldHiddenValue.Value.ToString().Split(';');
        string[] Checked = CheckboxHiddenValue.Value.ToString().Split(';');

        foreach (string fieldschecked in FieldChecked)
        {
            if (fieldschecked != string.Empty && fieldschecked != "")
            {
                Sys_CompanyModule sys_CM = target.CreateCompanyModule();
                string[] field = fieldschecked.Split('_');
                sys_CM.SM_ID = field[1].ToInt32();
                sys_CM.CM_Alias = field[2];
                sys_CM.C_ID = _company.C_ID;
                _company.Sys_CompanyModule.Add(sys_CM);
            }
        }

        //修改公司所有的子模块
        foreach (string checks in Checked)
        {
            if (checks != string.Empty && checks != "")
            {
                Sys_CompanysSubmodule sys_CSM = target.CreateCompanysSubmodule();
                string[] check = checks.Split('_');
                sys_CSM.SS_ID = check[1].ToInt32();
                sys_CSM.CS_Alias = check[2];
                sys_CSM.C_ID = _company.C_ID;
                _company.Sys_CompanysSubmodule.Add(sys_CSM);
            }
        }
............其它表就不列举了,我想也可以看明白了

先查,后更新,其实就是获取一个新对象, 然后在处理,这样它就有一个唯一的 entitykey, 就不会出现上面的问题了。


4. 第四方法,我觉得可以一试,而且也不错,就是通过entitykey,找到对象,然后Detach这个对象,随后再Attach我们新new 的对象
   
Sys_Companys co = new Sys_Companys { C_ID = id };
        object originalVal = null;
        System.Data.EntityKey key = _context.CreateEntityKey("Sys_Companys", co);
        if (_context.TryGetObjectByKey(key, out originalVal))
        {
            _context.Detach(originalVal);
        }

        co.C_Name = "";

        _context.Sys_Companys.Attach(co);

        co.C_Name = "我的名字";

        _context.SaveChanges();
        _context.Detach(co);
到这里就结束,祝君好运.
   



                    
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

针对【ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。】的解决方案

近期使用MVC4+EF5开发项目,做增删改查的时候经常会出现操作失败的问题,提示ObjectStateManager 无法跟踪具有相同键的多个对象。信息,经过几天的跟踪测试和网上查找一些相关资料发现是...

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

今天用entityframework去更新数据库

EF ObjectStateManager无法跟踪具有相同键的多个对象

一般这个问题会出现在EF更新数据库时。我查了很多资料,大致产生这个问题的原因是当前上下文中已经包含了这一条记录,而且是出于被跟踪状态,所以不能再附加具有相同键的对象,通俗点解释就是:出错这个错误是因为...

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

恭喜你,当你遇到此类问题,说明你的思路和我当初的思路是一样的。 在

Android中使用OpenGL ES实现纹理贴图以及实现多重纹理混合

OpenGL ES中最常用的纹理是2D纹理,也就是一个图像的二维数组,当我们使用纹理时,需要使用纹理坐标作为纹理图像中的索引。纹理坐标用(s, t)指定,或者(U, V)。纹理坐标如下图所示,纹理原点...

Spring中@Transactional事务回滚(含实例详细讲解,附源码)

一、使用场景举例在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用。下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某...

Entity Framework 学习初级篇2--ObjectContext、ObjectQuery、ObjectStateEntry、ObjectStateManager类的介绍

本节,简单的介绍EF中的ObjectContext、ObjectQuery、ObjectStateEntry、ObjectStateManager这个几个比较重要的类,它们都位于System.Data...

List合并具有相同属性的对象

业务背景:一个list集合了若干个student对象,并且student对象具有name和money属性,此时我们需要合并具有相同name属性的student的money. Student类的代码: ...
  • LINPE
  • LINPE
  • 2016年06月16日 20:00
  • 990

两个具有相同属性的对象之间属性的拷贝

在处理业务逻辑时,偶尔会有这样的需求:对象A已经实例化,但是有一些格式上的不符合标准,对象B没有具体的属性值但是格式却符合标准。 一般这样的情况会出现在DTO对象与VO对象之间。DTO需要实现序列化...

html中不使用内置对象的方式实现多个页面用同一变量

在html页面中我们会用一个变量去接收service端发送的数据(该数据通过websocket发送)。 如果想将其填充到页面的table这是很容易的,如果不同页面都要获取该对象是不行的,因为该变量的作...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EF ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象
举报原因:
原因补充:

(最多只允许输入30个字)