Asp.net 尝试通过存储库编辑数据库中的数据时获取exeption

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

所以我得到了这个解释 “附加“TimeTrackerProjectV2.Models.Project”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值” 当我试图通过Web应用程序编辑数据库中的数据时

控制器代码:

/ 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;

我打赌这与你的环境有关,在每次请求后都没有得到处理。您可以通过使用
语句为每个实例实例化
来测试这一点。看,这是故意的。你打字时做得很好,工作做得很好