我的一个控制器上的编辑操作遇到了奇怪的行为。
这是我的代码:
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'的实体。失败,因为同一类型的另一个实体已具有相同的主键值。使用'附加'等等
时会发生这种情况
有关为何发生这种情况的任何想法?
答案 0 :(得分:2)
db.Entry(personInformation).State
将personInformation
对象附加到EF上下文,错误引发,因为EF数据上下文先前已加载了具有相同id的不同Information
实例(可能在之前的版本中)你正在做Where()
。
至少有两个基本选项:
db.Information.AsNoTracking()
中)此扩展告诉EF数据上下文不要将从数据库中检索到的实体保留在内存中您可以将personInformation
实体直接附加到上下文并设置修改后的状态。db.Information.FindAsync
检索实体,如果先前已附加,则EF上下文将从内存中检索。var attachedEntity = db.Information.FindAsync(personInformation.ID); attachedEntity.ExampleValue = personInformation.ExampleValue; attachedEntity.ExampleValue2 = personInformation.ExampleValue2; ... and so on