木子屋 Dnawo's BLOG

ASP.NET MVC3更新出错:ObjectStateManager中已存在具有同一键的对象

👤 dnawo 📅 2013-05-08 👁 11360 👍 0 💬 0 🔄 来源:本站原创
[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
[color=Brown]oldperson.PicUrl = person.PicUrl;[/color]
db.SaveChanges();

Person oldperson = db.People[color=Brown].AsNoTracking()[/color].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
[color=Brown]db.Entry(oldperson).CurrentValues.SetValues(person);[/color]
db.SaveChanges();

参考资料

[1].An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key

评论(0)

暂无评论。

验证码
评论需审核通过后显示
← 上一篇 无线路由器有信号手机连不上原因解释 下一篇 → 找出页面没使用的css并移除