Asp.net 尝试通过存储库编辑数据库中的数据时获取exeption
所以我得到了这个解释 “附加“TimeTrackerProjectV2.Models.Project”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值” 当我试图通过Web应用程序编辑数据库中的数据时 控制器代码:Asp.net 尝试通过存储库编辑数据库中的数据时获取exeption,asp.net,asp.net-mvc,entity-framework,repository-pattern,Asp.net,Asp.net Mvc,Entity Framework,Repository Pattern,所以我得到了这个解释 “附加“TimeTrackerProjectV2.Models.Project”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值” 当我试图通过Web应用程序编辑数据库中的数据时 控制器代码: / GET: Projects/Edit/5 public ActionResult Edit(int? id) { if (id == null) { return new HttpStatusCod
/ 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();
}
我已经在互联网上搜索过了,但我找到的每个人都有它,因为他们使用的是attache,所以它并不真正适用于我的案例。发生这种情况是因为ef没有跟踪您的实体项目,所以它假设这是一个新实体,它正在附加它而不是更新它 您应该做的是,获取实体,更新值,然后使用entry.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;
我打赌这与你的环境有关,在每次请求后都没有得到处理。您可以通过使用
语句为每个实例实例化来测试这一点。看,这是故意的。你打字时做得很好,工作做得很好