zoukankan      html  css  js  c++  java
  • ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象

    程序代码
    [HttpPost]
    public ActionResult Edit(Person person)
    {
        if (ModelState.IsValid)
        {
            Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault();
            //TODO
            db.Entry(person).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(person);
    }


    上边代码试图在更新person到数据库前取出旧数据(oldperson)进行文件删除等操作,结果页面报错:

    引用内容
    ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。


    若是不取旧数据,该段代码执行可以正常执行,经过一番测试,猜测原因是读取旧数据时,对象会被添加到db中,当执行"db.Entry(person)"时,试图把person也添加到db中,但person和先前添加对象的键值是一样的,因而报错,这也解释了为什么不取旧数据不出错。

    下边提供三种解决方法:

    Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault();
    //TODO
    oldperson.PicUrl = person.PicUrl;
    db.SaveChanges();
    
    
    Person oldperson = db.People.AsNoTracking().Where(p => p.Id == person.Id).FirstOrDefault();
    //TODO
    db.Entry(person).State = EntityState.Modified;
    db.SaveChanges();
    
    
    
    Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault();
    //TODO
    db.Entry(oldperson).CurrentValues.SetValues(person);
    db.SaveChanges();
     
  • 相关阅读:
    镇中7日做题小结 day2
    镇中7日做题小结 day1
    关于开通luogu博客
    bitset用法和ch2101可达性统计
    离散化 下标与数值的深入理解
    黄题 P2038 无线网络发射器选址 被坑之痛
    最蒟蒻bug,没有之一
    http://www.laomaotao.net/?H4068
    C++设计模式——简单工厂模式
    面向对象的七个基本设计原则
  • 原文地址:https://www.cnblogs.com/renhongwei/p/6138920.html
Copyright © 2011-2022 走看看