Kurz gesagt, die Ausnahme wird während des POSTing-Wrapper-Modells ausgelöst und der Status eines Eintrags in "Geändert" geändert. Vor dem Ändern des Status wird der Status auf "Abgelöst" gesetzt, aber das Aufrufen von Attach () löst denselben Fehler aus. Ich benutze EF6.
Unten finden Sie meinen Code (Modellnamen wurden geändert, um das Lesen zu erleichtern).
Modell
// Wrapper classes
public class AViewModel
{
public A a { get; set; }
public List<B> b { get; set; }
public C c { get; set; }
}
Regler
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
if (!canUserAccessA(id.Value))
return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
var aViewModel = new AViewModel();
aViewModel.A = db.As.Find(id);
if (aViewModel.Receipt == null)
{
return HttpNotFound();
}
aViewModel.b = db.Bs.Where(x => x.aID == id.Value).ToList();
aViewModel.Vendor = db.Cs.Where(x => x.cID == aViewModel.a.cID).FirstOrDefault();
return View(aViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(AViewModel aViewModel)
{
if (!canUserAccessA(aViewModel.a.aID) || aViewModel.a.UserID != WebSecurity.GetUserId(User.Identity.Name))
return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
if (ModelState.IsValid)
{
db.Entry(aViewModel.a).State = EntityState.Modified; //THIS IS WHERE THE ERROR IS BEING THROWN
db.SaveChanges();
return RedirectToAction("Index");
}
return View(aViewModel);
}
Wie oben gezeigt
db.Entry(aViewModel.a).State = EntityState.Modified;
löst eine Ausnahme aus:
Das Anhängen einer Entität vom Typ 'A' ist fehlgeschlagen, da eine andere Entität desselben Typs bereits denselben Primärschlüsselwert hat. Dies kann passieren, wenn Sie die Methode "Anhängen" verwenden oder den Status einer Entität auf "Unverändert" oder "Geändert" setzen, wenn Entitäten im Diagramm widersprüchliche Schlüsselwerte aufweisen. Dies kann daran liegen, dass einige Entitäten neu sind und noch keine von der Datenbank generierten Schlüsselwerte erhalten haben. Verwenden Sie in diesem Fall die Methode 'Hinzufügen' oder den Entitätsstatus 'Hinzugefügt', um das Diagramm zu verfolgen, und setzen Sie den Status nicht neuer Entitäten entsprechend auf 'Unverändert' oder 'Geändert'.
Hat jemand etwas Falsches in meinem Code gesehen oder verstanden, unter welchen Umständen ein solcher Fehler beim Bearbeiten eines Modells auftreten würde?
db
Instanz zwischen Ihren beiden Aktionen identisch ist, kann dies Ihr Problem erklären, da Ihr Element von der GET-Methode geladen wird (dann vom Kontext verfolgt wird) und die in Ihrer POST-Methode möglicherweise nicht als die zuvor abgerufene Entität erkennt .
canUserAccessA()
laden Sie die Einheit direkt oder als eine Beziehung von einem anderen Rechtsträger?
EntityState
? Da Ihre Entität aus einer Post-Anfrage stammt, sollte sie nicht vom aktuellen Kontext erfasst werden. Ich denke, dass Sie versuchen, einen Artikel mit einer vorhandenen ID