zoukankan      html  css  js  c++  java
  • Entity Framework 同一个上下文中,如何进行对同一个实体进行指定字段更新

    我在上一篇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

  • 相关阅读:
    诺基亚为 Qt 增添 LGPL 授权选择
    Web Beans (JSR299): Q&amp;A with Specification Lead Gavin King
    Web Beans (JSR299): Q&amp;A with Specification Lead Gavin King
    诺基亚为 Qt 增添 LGPL 授权选择
    使用 Hibernate 进行大数据量的性能测试
    略谈如何在对话框创建视图类画图
    JBoss Seam 框架下的单元测试
    领域模型设计讨论与研究
    JBoss Seam 框架下的单元测试
    The use of FS/GS registers
  • 原文地址:https://www.cnblogs.com/flyfish2012/p/2957125.html
Copyright © 2011-2022 走看看