Будет полезно знать, что там, где может потребоваться AsNoTracking ().
В определенном сценарии, когда вы публикуете вызов Edit и перед тем, как фактически обновить модель в базе данных, вы пытаетесь проверить, существует ли конкретная запись или нет, и затем вы хотите выполнить вызов Update, он вызовет исключение. Ниже приведена демонстрация такого сценария.
public ActionResult Edit(Model model)
{
var modelFromDb = db.Model.Where(x => x.ID == model.ID);
if (modelFromDb.Count() > 0)
{
db.Entry(model).State = EntityState.Modified; //THIS IS WHERE THE ERROR WILL BE THROWN AS RECORD WITH ID IS ALREADY ATTACHED WITH modelFromDb OBJECT.
db.SaveChanges();
return RedirectToAction("Index");
}
return View(model);
}
Вы найдете много вопросов об ошибке, например: «Не удалось присоединить объект типа MODELNAME», поскольку другой объект того же типа уже имеет такое же значение первичного ключа », что может быть вызвано приведенным выше фрагментом.
AsNoTracking () может предотвратить такие исключения. Предлагаемый код будет как ниже.
public ActionResult Edit(Model model)
{
var modelFromDb = db.Model.AsNoTracking().Where(x => x.ID == model.ID);
if (modelFromDb.Count() > 0)
{
db.Entry(model).State = EntityState.Modified; //WORKS PERFECTLY.
db.SaveChanges();
return RedirectToAction("Index");
}
return View(model);
}
Вы можете сослаться на один такой вопрос, заданный здесь ASP.NET MVC - Не удалось подключить объект типа 'MODELNAME', поскольку другой объект того же типа уже имеет то же значение первичного ключа