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

时间:2017-08-14 13:20:04

标签: asp.net asp.net-mvc entity-framework repository-pattern

所以我得到了这个例外 "附加类型为' 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();
    }

我已经在互联网上搜索了它,但我找到的每个人都使用相同的例子,因为他们使用的是附件,所以它并没有真正适用于我的情况。

1 个答案:

答案 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;