W skrócie wyjątek jest generowany podczas POST-owania modelu otoki i zmiany stanu jednego wpisu na „Zmodyfikowany”. Przed zmianą stanu stan jest ustawiony na „Odłączony”, ale wywołanie metody Attach () powoduje zgłoszenie tego samego błędu. Używam EF6.
Proszę znaleźć mój kod poniżej (nazwy modeli zostały zmienione, aby były bardziej czytelne)
Model
// Wrapper classes
public class AViewModel
{
public A a { get; set; }
public List<B> b { get; set; }
public C c { get; set; }
}
Kontroler
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);
}
Jak pokazano powyżej
db.Entry(aViewModel.a).State = EntityState.Modified;
zgłasza wyjątek:
Dołączanie jednostki typu „A” nie powiodło się, ponieważ inna jednostka tego samego typu ma już tę samą wartość klucza podstawowego. Może się to zdarzyć, gdy używasz metody „Dołącz” lub ustawiasz stan jednostki na „Niezmieniony” lub „Zmodyfikowany”, jeśli jakiekolwiek elementy na wykresie mają sprzeczne wartości kluczowe. Może to być spowodowane tym, że niektóre jednostki są nowe i nie otrzymały jeszcze wartości kluczy wygenerowanych przez bazę danych. W takim przypadku użyj metody „Dodaj” lub stanu jednostki „Dodano”, aby prześledzić wykres, a następnie ustaw stan elementów, które nie są nowe, odpowiednio na „Niezmieniony” lub „Zmodyfikowany”.
Czy ktoś widzi coś złego w moim kodzie lub rozumie, w jakich okolicznościach spowodowałby taki błąd podczas edycji modelu?
dbinstancja jest taka sama między twoimi dwiema akcjami, może to wyjaśnić twój problem, ponieważ twój przedmiot jest ładowany metodą GET (a następnie śledzony przez kontekst) i może nie rozpoznawać tego w twojej metodzie POST jako wcześniej pobranej encji .
canUserAccessA()ładuje podmiot bezpośrednio czy jako relacja innego podmiotu?
EntityState? Ponieważ Twój podmiot pochodzi z żądania posta, nie powinien być śledzony przez bieżący kontekst, myślę, że uważa, że próbujesz dodać element z istniejącym identyfikatorem