Tóm lại, ngoại lệ được đưa ra trong mô hình trình bao bọc POSTing và thay đổi trạng thái của một mục nhập thành 'Đã sửa đổi'. Trước khi thay đổi trạng thái, trạng thái được đặt thành 'Đã tách rời' nhưng việc gọi Đính kèm () sẽ gây ra lỗi tương tự. Tôi đang sử dụng EF6.
Vui lòng tìm mã của tôi bên dưới (tên kiểu máy đã được thay đổi để dễ đọc hơn)
Mô hình
// Wrapper classes
public class AViewModel
{
public A a { get; set; }
public List<B> b { get; set; }
public C c { get; set; }
}
Bộ điều khiển
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);
}
Như hình trên dòng
db.Entry(aViewModel.a).State = EntityState.Modified;
ném ngoại lệ:
Không thể đính kèm một thực thể thuộc loại 'A' vì một thực thể khác cùng loại đã có cùng giá trị khóa chính. Điều này có thể xảy ra khi sử dụng phương pháp 'Đính kèm' hoặc đặt trạng thái của thực thể thành 'Không thay đổi' hoặc 'Đã sửa đổi' nếu bất kỳ thực thể nào trong biểu đồ có các giá trị khóa xung đột. Điều này có thể là do một số thực thể là mới và chưa nhận được các giá trị khóa do cơ sở dữ liệu tạo ra. Trong trường hợp này, hãy sử dụng phương pháp 'Thêm' hoặc trạng thái thực thể 'Đã thêm' để theo dõi biểu đồ và sau đó đặt trạng thái của các thực thể không phải là mới thành 'Không thay đổi' hoặc 'Đã sửa đổi' nếu thích hợp.
Có ai thấy bất cứ điều gì sai trong mã của tôi hoặc hiểu trong những trường hợp nào nó sẽ gây ra lỗi như vậy trong khi chỉnh sửa một mô hình?
db
trường hợp giống nhau giữa hai hành động của bạn, thì nó có thể giải thích sự cố của bạn, vì mục của bạn được tải bằng phương thức GET (sau đó được theo dõi bởi ngữ cảnh) và nó có thể không nhận dạng được thực thể trong phương thức POST của bạn là thực thể được tìm nạp trước đó .
canUserAccessA()
tải thực thể trực tiếp hay như một mối quan hệ của một đối tượng khác không?
EntityState
? Như một thực thể của bạn xuất phát từ một bài yêu cầu, nó không nên được theo dõi bởi bối cảnh hiện nay, tôi đoán rằng nó cho rằng bạn cố gắng thêm một mục với một ID hiện có