En un mot, l'exception est levée lors du POSTing du modèle de wrapper et en changeant l'état d'une entrée en «Modifié». Avant de changer l'état, l'état est défini sur «Détaché» mais l'appel de Attach () renvoie la même erreur. J'utilise EF6.
Veuillez trouver mon code ci-dessous (les noms des modèles ont été modifiés pour le rendre plus facile à lire)
Modèle
// Wrapper classes
public class AViewModel
{
public A a { get; set; }
public List<B> b { get; set; }
public C c { get; set; }
}
Manette
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);
}
Comme indiqué ci-dessus la ligne
db.Entry(aViewModel.a).State = EntityState.Modified;
lève une exception:
L'association d'une entité de type «A» a échoué car une autre entité du même type a déjà la même valeur de clé primaire. Cela peut se produire lorsque vous utilisez la méthode «Attacher» ou que vous définissez l'état d'une entité sur «Inchangé» ou «Modifié» si des entités du graphique ont des valeurs de clé en conflit. Cela peut être dû au fait que certaines entités sont nouvelles et n'ont pas encore reçu de valeurs de clé générées par la base de données. Dans ce cas, utilisez la méthode «Ajouter» ou l'état d'entité «Ajouté» pour suivre le graphique, puis définissez l'état des entités non nouvelles sur «Inchangé» ou «Modifié» selon le cas.
Est-ce que quelqu'un voit quelque chose de mal dans mon code ou comprend dans quelles circonstances cela générerait une telle erreur lors de l'édition d'un modèle?
db
instance est la même entre vos deux actions, elle peut expliquer votre problème, car votre élément est chargé par la méthode GET (puis suivi par le contexte), et il se peut qu'il ne reconnaisse pas celui de votre méthode POST comme l'entité récupérée auparavant .
canUserAccessA()
Charge- elle l'entité directement ou en tant que relation d'une autre entité?
EntityState
? Comme votre entité provient d'une demande de publication, elle ne doit pas être suivie par le contexte actuel, je suppose qu'elle considère que vous essayez d'ajouter un élément avec un identifiant existant