• 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

  • 相关阅读:
    ConcurrentHashMap源码分析
    HashMap源码与相关面试题
    字符串学习笔记(三)---- StringBuilder
    字符串学习笔记(二)---- StringBuffer
    Vue一些基本操作技巧
    PHP代码及命名规范
    Js返回顶部的方法
    linux下镜像网站的几种方法
    单例模式示例
    工厂模式和IOC练习
  • 原文地址:https://www.cnblogs.com/flyfish2012/p/2957125.html
Copyright © 2020-2023  润新知