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”不知道相关对象时,不会发生此行为。如果是异常,请发布异常。如果这是不受欢迎的行为,发布令人满意的行为以及实际结果是什么。对不起,克里斯,我附上了它。我忘了。谢谢你的快速回答。我以后会把这件事记在脑后,以确保它不再发生。