C# 正在附加类型为的实体。。失败是因为

C# 正在附加类型为的实体。。失败是因为,c#,entity-framework,asp.net-mvc-5,C#,Entity Framework,Asp.net Mvc 5,我在一个控制器上执行编辑操作时遇到异常行为 这是我的密码: public ActionResult Edit([Bind(Include = "ID,FirstName,LastName,Email,deleted,AId")] Information personInformation) { // to stop multiple calls to database var lstOfPeople = db.Information.Where(x => x.delete

我在一个控制器上执行编辑操作时遇到异常行为

这是我的密码:

public ActionResult Edit([Bind(Include = "ID,FirstName,LastName,Email,deleted,AId")] Information personInformation)
{

    // to stop multiple calls to database
    var lstOfPeople = db.Information.Where(x => x.deleted == false).ToList();

    if (ModelState.IsValid)
    {

        if (lstOfPeople.Any(x => x.Email.Equals(personInformation.Email, StringComparison.CurrentCultureIgnoreCase) && x.ID != personInformation.ID))
        {
            ModelState.AddModelError("", "This email already exists!");
            return View(personInformation);
        }

        db.Entry(personInformation).State = EntityState.Modified; // error here
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(personInformation);
}
现在,我在一个不同的控制器编辑操作中有了几乎完全相同的代码,它工作得很好。这就是:

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);
}
我收到的错误信息:

附加“ProjectName.Models.Information”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。使用“附加”时可能会发生这种情况。。等等

知道为什么会发生这种情况吗?

数据库条目(personInformation).State将
personInformation
对象附加到EF上下文中,因为EF数据上下文先前加载了具有相同id的不同
信息
实例(可能在前面的
Where()中)
您正在做)

至少有两个基本选项:

  • 第一个是对查询使用AsNoTracking()扩展名(如
    db.Information.AsNoTracking()
    )此扩展告诉EF data context不要将从数据库检索到的实体保留在内存中,以便您可以将
    personInformation
    实体直接附加到上下文并设置修改状态
  • 第二个选项是从ef数据上下文中检索实体并修改该实体(而不是personInformation实例)。您可以使用
    db.Information.FindAsync
    检索实体,如果EF上下文先前已连接,则将从内存中检索该实体
var attachedEntity=db.Information.FindAsync(personInformation.ID); AttacheIdentity.ExampleValue=personInformation.ExampleValue; AttacheIdentity.ExampleValue2=个人信息.ExampleValue2; ...
等等,
信息
的主键是什么?您的实体集上是否也启用了代理生成功能?@PoweredByOrange
ID
是信息的主键。。如何检查代理生成?还用于从数据库中删除(AsNoTracking()),谢谢! var attachedEntity = db.Information.FindAsync(personInformation.ID); attachedEntity.ExampleValue = personInformation.ExampleValue; attachedEntity.ExampleValue2 = personInformation.ExampleValue2; ... and so on