码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-12-06 20:42:21      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:objects   str   val   edit   出错   div   cti   class   存在   

程序代码
[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();

 

 

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

标签:objects   str   val   edit   出错   div   cti   class   存在   

原文地址:http://www.cnblogs.com/renhongwei/p/6138920.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!