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