간단히 말해서 POSTing 래퍼 모델과 한 항목의 상태를 '수정 됨'으로 변경하는 동안 예외가 발생합니다. 상태를 변경하기 전에 상태는 '분리됨'으로 설정되지만 Attach ()를 호출하면 동일한 오류가 발생합니다. EF6을 사용하고 있습니다.
아래에서 내 코드를 찾으십시오 (모델명이 읽기 쉽게 변경되었습니다).
모델
// Wrapper classes
public class AViewModel
{
public A a { get; set; }
public List<B> b { get; set; }
public C c { get; set; }
}
제어 장치
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);
}
위와 같이
db.Entry(aViewModel.a).State = EntityState.Modified;
예외가 발생합니다.
동일한 유형의 다른 엔티티에 이미 동일한 기본 키 값이 있으므로 유형 'A'의 엔티티를 연결하지 못했습니다. 이는 'Attach'메서드를 사용하거나 그래프의 항목에 충돌하는 키 값이있는 경우 항목 상태를 '변경되지 않음'또는 '수정 됨'으로 설정할 때 발생할 수 있습니다. 일부 항목이 새 항목이고 아직 데이터베이스 생성 키 값을받지 못했기 때문일 수 있습니다. 이 경우 'Add'메소드 또는 'Added'항목 상태를 사용하여 그래프를 추적 한 다음 새 항목이 아닌 항목의 상태를 'Unchanged'또는 'Modified'로 적절하게 설정합니다.
아무도 내 코드에서 잘못된 것을 보거나 모델을 편집하는 동안 이러한 오류가 발생하는 상황을 이해합니까?
db
인스턴스가 당신의 두 가지 작업 사이의 동일 당신의 품목이 GET 방식 (다음 컨텍스트에 의해 추적)에 의해로드 될 때, 그것은 당신의 문제를 설명 할 수 있고, 기업은 이전에 가져온로는 POST 방법의 하나를 인식하지 못할 수 있습니다 .
canUserAccessA()
엔티티를 직접로드 합니까 아니면 다른 엔티티의 관계로로드 합니까 ?
EntityState
? 귀하의 엔터티는 게시 요청에서