2017-08-14 44 views
1

因此即時獲得此免除 「附加類型爲'TimeTrackerProjectV2.Models.Project'的實體失敗,因爲另一個相同類型的實體已具有相同的主鍵值」 當我嘗試通過我的web應用程序編輯數據庫中的數據時。當試圖通過存儲庫編輯我的數據庫中的數據時獲取exeption

控制器代碼:

/ GET: Projects/Edit/5 
    public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     return View(Repositories.ProjectsRepository.GetProject(id)); 
    } 

    // POST: Projects/Edit/5 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see https://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include = "IdProject,Name,Number,Active")] Project project) 
    { 
     if (ModelState.IsValid) 
     { 

      Repositories.ProjectsRepository.EditProjects(project); 
      Repositories.ProjectsRepository.SaveProject(); 
      return RedirectToAction("Index"); 
     } 
     return View(project); 
    } 

庫的代碼;

public static void EditProjects(Project project) 
    { 

      db.Entry(project).State = EntityState.Modified; 

    } 
    public static void SaveProject() 
    { 
     db.SaveChanges(); 
    } 

我已經搜查了互聯網,但大家的是,我發現了同樣的exeption,因爲他們使用武官所以它沒有真正適用於我的情況下有它。

+0

我敢打賭,這與你的情況下沒有得到安置在每個請求之後做的。你可以通過使用'using'語句爲每個實例化來測試它。請參閱[this](https://stackoverflow.com/questions/23201907/asp-net-mvc-attaching-an-entity-of-type-modelname-failed-because-another-ent) –

回答

1

發生這種情況是因爲ef沒有跟蹤您的實體項目,所以它假設這是一個新的實體,它附加它而不是更新 您應該做的是獲取實體,更新值,然後自用進境<> .STATE

像這樣

// Get By ID 
var TheEntity = db.Projects.FirstOrDefault(x => x.ID = project.ID); 
//Update Values like 
TheEntity.someProperty = project.someProperty ; 
//Do it for all and then update the state of TheEntity 
db.Entry(TheEntity).State = EntityState.Modified; 
+0

這可以用作滿意的。當你鍵入並完美工作時,做得很棒 –

相關問題