附加类型的实体失败,因为

时间:2017-03-29 16:10:55

标签: c# entity-framework asp.net-mvc-5

我的一个控制器上的编辑操作遇到了奇怪的行为。

这是我的代码:

public ActionResult Edit([Bind(Include = "ID,RNumber,DateCreated,PersonWhoCreated,deleted")] OtherTable oTable)
{
    if (ModelState.IsValid)
    {
        if (db.OtherTable.Any(x => x.RNumber.Equals(oTable.RNumber, StringComparison.CurrentCultureIgnoreCase) && x.ID != oTable.ID))
        {
            ModelState.AddModelError("RNumber", "This number already exists!");
            return View(oTable);
        }

        db.Entry(oTable).State = EntityState.Modified; // no error here.. goes through fine.
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(oTable);
}

现在我在不同的控制器编辑操作中有相同的完全相同的代码,它工作正常。这就是:

---
- hosts: all                                   
  remote_user: user                         
  tasks:
      - name: Printing the Jenkins version running on the masters
        yum:
          name: jenkins
        register: version

      - debug: var=version

我收到的错误:

  

附加类型为' ProjectName.Models.Information'的实体。失败,因为同一类型的另一个实体已具有相同的主键值。使用'附加'等等

时会发生这种情况

有关为何发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:2)

db.Entry(personInformation).StatepersonInformation对象附加到EF上下文,错误引发,因为EF数据上下文先前已加载了具有相同id的不同Information实例(可能在之前的版本中)你正在做Where()

至少有两个基本选项:

  • 第一个是为您的查询使用AsNoTracking()扩展,(如在db.Information.AsNoTracking()中)此扩展告诉EF数据上下文不要将从数据库中检索到的实体保留在内存中您可以将personInformation实体直接附加到上下文并设置修改后的状态。
  • 第二个选项是从ef数据上下文中检索实体并修改该实体(而不是personInformation实例)。您可以使用db.Information.FindAsync检索实体,如果先前已附加,则EF上下文将从内存中检索。
    var attachedEntity = db.Information.FindAsync(personInformation.ID);
    attachedEntity.ExampleValue = personInformation.ExampleValue;
    attachedEntity.ExampleValue2 = personInformation.ExampleValue2;
    ...
    and so on