Özetle, istisna, POSTing sarıcı modeli sırasında ve bir girişin durumunu 'Değiştirilmiş' olarak değiştirirken atılır. Durumu değiştirmeden önce, durum 'Ayrıldı' olarak ayarlanır, ancak Attach () çağrısı aynı hatayı verir. EF6 kullanıyorum.
Lütfen aşağıda kodumu bulun (model isimleri okumayı kolaylaştırmak için değiştirildi)
model
// Wrapper classes
public class AViewModel
{
public A a { get; set; }
public List<B> b { get; set; }
public C c { get; set; }
}
kontrolör
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);
}
Yukarıdaki satırda gösterildiği gibi
db.Entry(aViewModel.a).State = EntityState.Modified;
istisna atar:
Aynı türden başka bir varlık zaten aynı birincil anahtar değerine sahip olduğundan 'A' türünde bir varlık ekleme başarısız oldu. Bu, grafikteki herhangi bir varlığın çakışan anahtar değerlerine sahip olması durumunda, "Ekle" yöntemini kullanırken veya bir varlığın durumunu "Değiştirilmedi" veya "Değiştirildi" olarak ayarladığınızda olabilir. Bunun nedeni, bazı varlıkların yeni olması ve henüz veritabanı tarafından üretilen anahtar değerlerini almamış olması olabilir. Bu durumda grafiği izlemek için 'Ekle' yöntemini veya 'Eklendi' varlık durumunu kullanın ve ardından yeni olmayan varlıkların durumunu uygun şekilde 'Değiştirilmedi' veya 'Değiştirildi' olarak ayarlayın.
Kodumda yanlış bir şey gören veya bir modeli düzenlerken hangi durumlarda böyle bir hata vereceğini anlayan var mı?
db
örnek verilen iki eylemler arasında aynıdır öğe GET yöntemi (daha sonra bağlam tarafından izlenen) tarafından yüklendiği için, bu sorunu açıklayabilir ve varlık önce getirilen olarak sizin POST yöntemiyle bir tane tanımayabilir .
canUserAccessA()
Varlığı doğrudan mı yoksa başka bir yetkili ile ilişkisi olarak mı yüklüyor?
EntityState
mi? Varlığınız bir gönderi talebinden geldiğinden, mevcut bağlam tarafından izlenmemelidir, sanırım mevcut bir kimliğe sahip bir öğe eklemeye çalıştığınızı düşünür