1

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

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

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

1 回答 1

3

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

当当前Inventory项目不为人所知ObjectContext(如您的第一个示例中)时,上下文无法识别Inventory和之间的关系。Dependency由于您对 a 的查询Inventory未知,因此将加载它,并且当您将其附加到您的.ObjectContextInventoryObjectContext

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

文档指出:

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

当相关对象不为ObjectContext.

于 2012-04-04T17:54:11.780 回答