2012-11-09 89 views
0

有关此错误的很多问题,但我无法弄清我的问题(也许我需要更多关于此的理论)。ObjectStatemanager中已存在具有相同密钥的对象

我开始“对象具有相同的密钥已存在objectStatemanager”错误,而即时尝试做的是如此简单,我只是有一个编辑视图的客户端,其中有一个电话列表。当用户点击保存按钮时,我只是用Json包装所有东西,然后用Ajax将它发送给控制器。

在控制器上,我应该检查我发送的清单上的哪些电话应该更新,插入为新闻并删除。

因此,这里的代码(即抛出提到exeception之一)的重要组成部分:

  if (ModelState.IsValid) 
      { 
       foreach (var tel in propModel.Proprietario.Telefones) 
       { 
        //Updates 
        TelefoneProprietario telToEdit = null; 
        if (tel.IDTelefoneProprietario.HasValue) 
         telToEdit = db.TelefonesProprietarios.Find(tel.IDTelefoneProprietario); 
        if (telToEdit != null) 
        { 
         db.Entry(tel).State = EntityState.Modified; << Exception HERE!!! 
        } 
        else 
        { 
         //Inserts 
         db.TelefonesProprietarios.Add(tel); 
        } 
       } 

       if (propModel.Proprietario.IDProprietario.HasValue) 
       { 
        var prop = db.Proprietarios.Find(propModel.Proprietario.IDProprietario); 
        prop.LoadLists(); 
        foreach (var telDel in prop.Telefones) 
        { 
         //Deletes 
         if (propModel.Proprietario.Telefones.Find(t => t.IDTelefoneProprietario == telDel.IDTelefoneProprietario) == null) 
         { 
          db.TelefonesProprietarios.Remove(telDel); 
         } 
        } 
       } 

       db.Entry(propModel.Proprietario).State = EntityState.Modified; 
       db.SaveChanges(); 

       return Json(new { Success = 1, IDProprietario = propModel.Proprietario.IDProprietario, ex = "" }); 
      } 

任何帮助或建议?

,并使其更坏:我把线抛出异常时,只是为了测试代码的其余部分,并在调用SaveChanges之前的最后一行,它抛出另一个异常:

The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects. 

UPDATE:

我设法解决这个问题的另一种形式重新编写上述日常工作的一部分,就像这样:现在

   if (prop.IDProprietario.HasValue) 
       { 
        //Separete updates/inserts from deletes 
        List<int?> dbTels = db.TelefonesProprietarios 
            .Where(dt => dt.IDProprietario == prop.IDProprietario) 
            .Select(dt => dt.IDTelefoneProprietario) 
            .ToList(); 

        List<int?> postedTels = prop.Telefones 
         .Select(pt => pt.IDTelefoneProprietario) 
         .ToList(); 

        List<int?> deletedTels = dbTels 
         .Except(postedTels).ToList(); 

        //Perform deletes 
        foreach (var delTelId in deletedTels) 
        { 
         if (delTelId.HasValue) 
         { 
          TelefoneProprietario delTel = db.TelefonesProprietarios 
           .Where(dt => dt.IDProprietario == prop.IDProprietario && dt.IDTelefoneProprietario == delTelId) 
           .Single(); 

          db.Entry(delTel).State = EntityState.Deleted; 
         } 
        } 

        //Perform insert and updates 
        foreach (var tel in prop.Telefones) 
        { 
         if (tel.IDTelefoneProprietario.HasValue) 
         { 
          db.Entry(tel).State = EntityState.Modified; 
         } 
         else 
         { 
          db.Entry(tel).State = EntityState.Added; 
          tel.IDProprietario = (int)prop.IDProprietario; 
         } 
        } 

        db.Entry(prop).State = EntityState.Modified; 
       } 
       else 
       { 
        db.Proprietarios.Add(prop); 
       } 
       db.SaveChanges(); 

唯一的问题只剩下用于删除临prietario实例(因为它有一个TelefoneProprietario列表,而TelefoneProprietario有一个参照它的拥有者的Proprietario。这个内容会导致“这两个对象之间的关系不能被定义,因为它们被附加到不同的ObjectContext对象上”,正如这里所讨论的那样...试图找出一个解决方案,所以如果你能指点我一些东西......)

回答

1

当你这样做:db.Entry(tel).State = EntityState.Modified;

电话:对象就是你传递一个对象模型,对不对?

在这个时候所以EF上下文没有保持它具有关键同一电话的主要在这种情况下,任何物体的轨道IDTelefoneProprietario

因此,如果你的对象状态设置为修改,随后SaveChanges() EF会抛出错误。

而是执行此操作:

if (telToEdit != null) 
{ 
    // Do apply all the changes from 'tel' to 'telToEdit' object here 
    ... 
    db.Entry(telToEdit).State = EntityState.Modified; // No Exception I hope :) 
} 

希望这是有道理的。

+0

是的,它使得感觉。不幸的是,我仍然有一些问题来了解EF漏洞(以及它的工作原理)。在这一点上(和你告诉我的同步),我重新编写了洞方法。现在,它就像我刚才在问题(上面)上粘贴的那个,它正在工作。问题是在删除例程中(因为我的Proprietario类有一个TelefoneProprietario列表和一个TelefoneProprietario对Proprietario的引用,我得到了“两个对象之间的关系无法定义,因为它们连接到不同的ObjectContext对象”例外)... –

相关问题