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();

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM