我在上一篇EF更新指定的字段当中介绍了,如何在EF指定字段进行更新。但这个有个缺陷,如果在同一个上下文当中,进行更新的话就会报:
ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象
问题的原因在于,我们之前已经附加过当前实体,如果再进行Attach的时候,就会报这样的错。
解决办法:1.销毁之前的上下文,重新开启上下文。(等于白说)
2.更改当前上下文的实体的状态。(这个是问题关键)
如下代码:
//再修改Blog名称,根据主键找到当前实体,判断然后进行更新状态 var entry = dbcontext.Set<Blogs>().Find(id); if (entry != null) { dbcontext.Entry<Blogs>(entry).State = System.Data.EntityState.Detached; //这个是在同一个上下文能修改的关键 }
这样就可以了。问题解决。这个是我测试代码。大家可以根据自己的需求进行封装。
附带5个状态解释:
成员名称 | 说明 |
---|---|
Detached | 对象存在,但没有被跟踪。 在创建实体之后、但将其添加到对象上下文之前,该实体处于此状态。 An entity is also in this state after it has been removed from the context by calling the Detach method or if it is loaded by using a NoTrackingMergeOption. 没有 ObjectStateEntry 实例与状态为 Detached 的对象关联。 |
Unchanged | 自对象附加到上下文中后,或自上次调用 SaveChanges 方法后,此对象尚未经过修改。 |
Added | 对象为新对象,并且已添加到对象上下文,但尚未调用 SaveChanges 方法。 在保存更改后,对象状态将更改为 Unchanged。 状态为 Added 的对象在 ObjectStateEntry 中没有原始值。 |
Deleted | 对象已从对象上下文中删除。 在保存更改后,对象状态将更改为 Detached。 |
Modified | 对象上的一个标量属性已更改,但尚未调用 SaveChanges 方法。 在不带更改跟踪代理的 POCO 实体中,调用 DetectChanges 方法时,已修改属性的状态将更改为 Modified。 在保存更改后,对象状态将更改为 Unchanged。 |
示例代码下载:UpdateMoreField.zip