C# 为什么在尝试重新附加对象时出现InvalidOperationException

C# 为什么在尝试重新附加对象时出现InvalidOperationException,c#,entity-framework,detach,C#,Entity Framework,Detach,我在试图理解为什么我的代码会崩溃(我开始工作)时遇到了一些困难 当您查看原始方法和工作方法时,一行的位置是不同的 ctx.Inventories.Attach(this); 当原来的方法不起作用,而第二个却起作用时,我感到困惑。 有人能提供一些见解吗 这是我得到的一个例外 System.InvalidOperationException:ObjectStateManager中已存在具有相同密钥的对象。ObjectStateManager无法跟踪具有相同密钥的多个对象 这是我原来的方法 pu

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

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

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;
}

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

对象上下文
不知道当前
库存
项目时(如第一个示例中所示),则上下文无法识别
库存
相关性
之间的关系。由于
ObjectContext
不知道
Inventory
,因此当您将
ObjectContext
附加到
ObjectContext
时,您对
Inventory
的查询将加载它,并且项目已经存在

在第二个示例中,首先附加
库存
,然后执行查询。然后,
ObjectContext
会将
依赖项
对象显式附加到
库存

各国:

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


ObjectContext

公共重复:Define“not work”不知道相关对象时,不会发生此行为。如果是异常,请发布异常。如果这是不受欢迎的行为,发布令人满意的行为以及实际结果是什么。对不起,克里斯,我附上了它。我忘了。谢谢你的快速回答。我以后会把这件事记在脑后,以确保它不再发生。