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 无法跟踪具有相同键的多个对象。信息,经过几天的跟踪测试和网上查找一些相关资料发现是...
  • newd_2011
  • newd_2011
  • 2015年11月21日 16:25
  • 3056

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

今天用entityframework去更新数据库
  • a5534789
  • a5534789
  • 2014年07月31日 09:43
  • 3532

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

恭喜你,当你遇到此类问题,说明你的思路和我当初的思路是一样的。 在
  • u014656209
  • u014656209
  • 2014年06月22日 09:17
  • 1027

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

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

EF Attach时已存在的处理方式

如果我们在先前的步骤中读取过数据,如 var list = db.Model.ToList(); 之后再,附加 var o = new Model { Id = 1 }; db.Model.A...
  • killcwd
  • killcwd
  • 2016年06月20日 13:41
  • 1654

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

今天编码过程中遇到这个问题,在网上也查了一些所说的方式方法,但我不能使用,为什么这里面就不表述了 说重点吧。 我这个是这么理解的,出现这个问题应该是 ObjectContext 中被 attach 了...
  • jzep_lj
  • jzep_lj
  • 2013年12月03日 01:24
  • 4246

MVC实用构架设计(三)——EF-Code First(6):数据更新最佳实践

前言   最近在整理EntityFramework数据更新的代码,颇有体会,觉得有分享的价值,于是记录下来,让需要的人少走些弯路也是好的。   为方便起见,先创建一个控制台工程,使用usi...
  • dz45693
  • dz45693
  • 2016年04月11日 13:25
  • 1316

ObjectStateManager 不包含具有对“Model”类型的对象的引用的 ObjectStateEntry

ObjectStateManager 不包含具有对“Model”类型的对象的引用的 ObjectStateEntry 由于DAL层的类是别人写的,传进来的实体对象名是“model”,us...
  • zyh_1988
  • zyh_1988
  • 2016年10月11日 14:29
  • 506

Entity framework "无法删除此对象,因为未在 ObjectStateManager 中找到它"

今天在做删除数据的时候遇到这个问题,以前用ENTITY FRAMEWORK删除实体的时候没有遇到这种情况,后来在网上查了下资料才知道问题的原由,我是用两个类来协作做这个动作的,两个类都定义了数据连接接...
  • ljyabc1028
  • ljyabc1028
  • 2011年04月16日 20:14
  • 5318

已添加了具有相同键的项。

有两个相同的字段,删除一个即可
  • u014479921
  • u014479921
  • 2016年03月22日 17:39
  • 719
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EF ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象
举报原因:
原因补充:

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