为啥我在尝试重新附加对象时收到 InvalidOperationException

Posted

技术标签:

【中文标题】为啥我在尝试重新附加对象时收到 InvalidOperationException【英文标题】:Why am I getting an InvalidOperationException when trying to re-attach an object为什么我在尝试重新附加对象时收到 InvalidOperationException 【发布时间】:2012-04-04 17:33:35 【问题描述】:

我在试图理解为什么我的代码崩溃(我开始工作)时遇到了一些困难。

当你同时查看原始方法和工作方法时,一行的位置是不同的

ctx.Inventories.Attach(this);

当原始方法不起作用但第二种方法起作用时,我感到很困惑。 谁能提供一些见解?

这是我得到的例外。

System.InvalidOperationException : ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象。

这是我原来的方法

  public void RemoveDependency(int depId)
    
        bool returnValue = false;

        if (this.Id != 0 && depId > 0)
        
            using (ApsEntities ctx = new ApsEntities())
            
                var query2 = from d in ctx.Dependencies
                             where d.Id == depId
                             select d;

                Dependency found = query2.FirstOrDefault();

                if (found != null)
                
                **ctx.Inventories.Attach(this);**
                    ctx.ObjectStateManager.ChangeObjectState(this, EntityState.Modified);
                    this.Dependencies.Remove(found);

                   ctx.SaveChanges();
                
            
        

        return returnValue;
    

这是我的工作方法

public void RemoveDependency(int depId)

    bool returnValue = false;

    if (this.Id != 0 && depId > 0)
    
        using (ApsEntities ctx = new ApsEntities())
        
            **ctx.Inventories.Attach(this);**

            var query2 = from d in ctx.Dependencies
                         where d.Id == depId
                         select d;

            Dependency found = query2.FirstOrDefault();

            if (found != null)
            
                ctx.ObjectStateManager.ChangeObjectState(this, EntityState.Modified);
                this.Dependencies.Remove(found);

               ctx.SaveChanges();
            
        
    

    return returnValue;

【问题讨论】:

常见的副歌:定义“不起作用”。如果是异常,请发布异常。如果是不良行为,请发布所需行为以及实际结果。 对不起,克里斯,我已经附上了。它让我忘记了。 【参考方案1】:

该行为与 ObjectStateManager 跟踪关系有关。

如果ObjectContext 不知道当前的Inventory 项目(如您的第一个示例),则上下文无法识别InventoryDependency 之间的关系。由于InventoryObjectContext 是未知的,您对Inventory 的查询将加载它,并且当您将其附加到ObjectContext 时该项目已经存在。

在第二个示例中,您首先附加Inventory,然后执行查询。然后ObjectContext 将明确地将Dependency 对象附加到Inventory 项目。

documentation 声明:

ObjectStateManager 跟踪查询结果,并提供合并逻辑 多个重叠的查询结果。它还执行内存更改 跟踪用户何时插入、删除或修改对象,以及 提供更新的变更集。此更改集由 更改处理器以保留修改。

ObjectContext 不知道相关对象时,不会发生此行为。

【讨论】:

感谢您的快速回答。以后我会把这件事记在心里,以确保它永远不会再发生。

以上是关于为啥我在尝试重新附加对象时收到 InvalidOperationException的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在尝试使用 fetch 连接 Api 时收到“错误请求”错误 400?

我在尝试打开/显示新表单时有时会收到 ArgumentException 参数无效,为啥?

为啥我在运行查询时收到错误 -4700(尝试使用新功能模式)?

为啥我在尝试访问此 WordPress 网站时收到此 403 Forbidden 错误?为啥它无法读取 .htaccess 文件?

为啥我在尝试编辑离开语音频道的用户时会收到 DiscordAPIError?

为啥我在尝试通过 Matlab ftp 访问 Box 时收到“连接被拒绝”?