所以我得到了这个例外 "附加类型为' TimeTrackerProjectV2.Models.Project'的实体失败,因为同一类型的另一个实体已经具有相同的主键值" 当我尝试通过我的webapplication编辑数据库中的数据时。
控制器代码:
/ 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();
}
我已经在互联网上搜索了它,但我找到的每个人都使用相同的例子,因为他们使用的是附件,所以它并没有真正适用于我的情况。
答案 0 :(得分: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;