En pocas palabras, la excepción se lanza durante la publicación del modelo de envoltura y el cambio del estado de una entrada a 'Modificado'. Antes de cambiar el estado, el estado se establece en 'Separado' pero llamar a Attach () arroja el mismo error. Estoy usando EF6.
Encuentre mi código a continuación (los nombres de los modelos se han cambiado para que sea más fácil de leer)
Modelo
// Wrapper classes
public class AViewModel
{
public A a { get; set; }
public List<B> b { get; set; }
public C c { get; set; }
}
Controlador
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);
}
Como se muestra arriba de la línea
db.Entry(aViewModel.a).State = EntityState.Modified;
lanza una excepción:
No se pudo adjuntar una entidad de tipo 'A' porque otra entidad del mismo tipo ya tiene el mismo valor de clave principal. Esto puede suceder cuando se usa el método 'Adjuntar' o se establece el estado de una entidad en 'Sin cambios' o 'Modificado' si alguna de las entidades del gráfico tiene valores clave en conflicto. Esto puede deberse a que algunas entidades son nuevas y aún no han recibido valores clave generados por la base de datos. En este caso, use el método 'Agregar' o el estado de la entidad 'Agregado' para rastrear el gráfico y luego establezca el estado de las entidades no nuevas en 'Sin cambios' o 'Modificado' según corresponda.
¿Alguien ve algo incorrecto en mi código o entiende en qué circunstancias arrojaría tal error durante la edición de un modelo?
db
instancia es la misma entre sus dos acciones, puede explicar su problema, ya que su elemento es cargado por el método GET (luego es rastreado por el contexto), y es posible que no reconozca el de su método POST como la entidad recuperada antes. .
canUserAccessA()
Carga la entidad directamente o como relación de otra entidad?
EntityState
? Como su entidad proviene de una solicitud de publicación, no debe ser rastreada por el contexto actual, supongo que considera que intenta agregar un elemento con una ID existente