为啥我在尝试重新附加对象时收到 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
项目(如您的第一个示例),则上下文无法识别Inventory
和Dependency
之间的关系。由于Inventory
对ObjectContext
是未知的,您对Inventory
的查询将加载它,并且当您将其附加到ObjectContext
时该项目已经存在。
在第二个示例中,您首先附加Inventory
,然后执行查询。然后ObjectContext
将明确地将Dependency
对象附加到Inventory
项目。
documentation 声明:
ObjectStateManager 跟踪查询结果,并提供合并逻辑 多个重叠的查询结果。它还执行内存更改 跟踪用户何时插入、删除或修改对象,以及 提供更新的变更集。此更改集由 更改处理器以保留修改。
当ObjectContext
不知道相关对象时,不会发生此行为。
【讨论】:
感谢您的快速回答。以后我会把这件事记在心里,以确保它永远不会再发生。以上是关于为啥我在尝试重新附加对象时收到 InvalidOperationException的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在尝试使用 fetch 连接 Api 时收到“错误请求”错误 400?
我在尝试打开/显示新表单时有时会收到 ArgumentException 参数无效,为啥?
为啥我在运行查询时收到错误 -4700(尝试使用新功能模式)?
为啥我在尝试访问此 WordPress 网站时收到此 403 Forbidden 错误?为啥它无法读取 .htaccess 文件?