In poche parole, l'eccezione viene generata durante il POST del modello wrapper e la modifica dello stato di una voce in "Modificato". Prima di modificare lo stato, lo stato è impostato su "Detached" ma la chiamata di Attach () genera lo stesso errore. Sto usando EF6.
Si prega di trovare il mio codice di seguito (i nomi dei modelli sono stati modificati per facilitarne la lettura)
Modello
// Wrapper classes
public class AViewModel
{
public A a { get; set; }
public List<B> b { get; set; }
public C c { get; set; }
}
controllore
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);
}
Come mostrato sopra la riga
db.Entry(aViewModel.a).State = EntityState.Modified;
genera un'eccezione:
Il collegamento di un'entità di tipo "A" non è riuscito perché un'altra entità dello stesso tipo ha già lo stesso valore di chiave primaria. Ciò può accadere quando si utilizza il metodo "Allega" o si imposta lo stato di un'entità su "Invariato" o "Modificato" se le entità nel grafico hanno valori chiave in conflitto. Ciò può essere dovuto al fatto che alcune entità sono nuove e non hanno ancora ricevuto i valori chiave generati dal database. In questo caso, utilizza il metodo "Aggiungi" o lo stato dell'entità "Aggiunto" per tenere traccia del grafico, quindi imposta lo stato delle entità non nuove su "Non modificato" o "Modificato", a seconda dei casi.
Qualcuno vede qualcosa di sbagliato nel mio codice o capisce in quali circostanze genererebbe un tale errore durante la modifica di un modello?
db
istanza è la stessa tra le tue due azioni, può spiegare il tuo problema, poiché il tuo articolo viene caricato dal metodo GET (quindi tracciato dal contesto) e potrebbe non riconoscere quello nel tuo metodo POST come l'entità recuperata prima .
canUserAccessA()
caricare l'entità direttamente o come un rapporto di un altro entitiy?
EntityState
? Poiché la tua entità proviene da una richiesta di post, non dovrebbe essere tracciata dal contesto corrente, immagino che consideri che provi ad aggiungere un elemento con un ID esistente