Singkatnya, pengecualian dilemparkan selama model pembungkus POSTing dan mengubah status satu entri menjadi 'Dimodifikasi'. Sebelum mengubah status, status disetel ke 'Terpisah' tetapi memanggil Attach () tidak memunculkan kesalahan yang sama. Saya menggunakan EF6.
Silakan temukan kode saya di bawah ini (nama model telah diubah agar lebih mudah dibaca)
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);
}
Seperti yang ditunjukkan di atas garis
db.Entry(aViewModel.a).State = EntityState.Modified;
melempar pengecualian:
Gagal melampirkan entitas jenis 'A' karena entitas lain dengan jenis yang sama sudah memiliki nilai kunci utama yang sama. Hal ini dapat terjadi saat menggunakan metode 'Lampirkan' atau menyetel status entitas menjadi 'Tidak Berubah' atau 'Dimodifikasi' jika ada entitas dalam grafik yang memiliki nilai kunci yang bertentangan. Ini mungkin karena beberapa entitas baru dan belum menerima nilai kunci yang dihasilkan database. Dalam kasus ini, gunakan metode 'Tambah' atau status entitas 'Ditambahkan' untuk melacak grafik dan kemudian setel status entitas bukan baru ke 'Tidak Berubah' atau 'Dimodifikasi' yang sesuai.
Adakah yang melihat ada yang salah dalam kode saya atau memahami dalam keadaan apa kesalahan tersebut akan terjadi saat mengedit model?
dbinstance sama di antara dua tindakan Anda, ini dapat menjelaskan masalah Anda, karena item Anda dimuat dengan metode GET (kemudian dilacak oleh konteksnya), dan mungkin tidak mengenali yang ada di metode POST Anda sebagai entitas yang diambil sebelumnya .
canUserAccessA()memuat entitas secara langsung atau sebagai relasi dari entitas lain?
EntityState? Karena entitas Anda berasal dari permintaan posting, itu tidak boleh dilacak oleh konteks saat ini, saya rasa itu menganggap bahwa Anda mencoba menambahkan item dengan ID yang ada