求助:Entity Framework中Aggiorna方法无法保存数据修改
EF中修改操作(Aggiorna方法)无法保存数据的解决办法
现有基于Entity Framework的项目中,创建、查询、删除Anagrafica数据的功能均正常,但点击修改页面的Salva按钮后,Aggiorna方法无法保存数据修改,以下是问题分析和解决方案:
问题根源
FormModifica方法未加载目标实体:原方法未接收id参数,也未从数据库加载对应记录传递给视图,导致视图绑定的模型IdAnagrafica为默认值0。- 视图未传递主键ID:仅用
DisplayFor展示IdAnagrafica,未生成隐藏字段,提交表单时控制器无法获取目标记录的主键,EF无法定位要修改的条目。 Aggiorna方法缺少验证:直接设置EntityState.Modified但未验证实体是否存在,若主键无效则EF不会执行更新操作。
分步解决方案
1. 修改控制器FormModifica方法
让方法接收id参数并从数据库加载对应实体,传递给视图:
public ActionResult FormModifica(int id) { ContestoDB _contesto = new ContestoDB(); var anagrafica = _contesto.Anagrafica.Find(id); if (anagrafica == null) { return HttpNotFound(); } return View(anagrafica); }
2. 修改修改视图(FormModifica.cshtml)
添加HiddenFor字段传递主键ID,确保表单提交时能正确传递目标记录的ID:
@model AnagraficaEF.DA.Anagrafica @{ ViewBag.Title = "FormModifica"; } <h2>Form Modifica</h2> @using (Html.BeginForm("Aggiorna", "Anagrafica", FormMethod.Post)) { <!-- 添加隐藏字段传递主键ID --> @Html.HiddenFor(m => m.IdAnagrafica) <div class="form-group"> @Html.Label("ID") @Html.DisplayFor(m => m.IdAnagrafica) </div> <div class="form-group"> @Html.LabelFor(m => m.Nome) @Html.TextBoxFor(m => m.Nome, new { @class = "form-control" }) </div> <div class="form-group"> @Html.LabelFor(m => m.Cognome) @Html.TextBoxFor(m => m.Cognome, new { @class = "form-control" }) </div> <div class="form-group"> @Html.LabelFor(m => m.Sesso) @Html.TextBoxFor(m => m.Sesso, new { @class = "form-control" }) </div> <button type="submit" class="btn btn-success">Salva</button> }
3. 优化Aggiorna方法
增加模型验证和实体存在性检查,手动更新字段(比直接设置EntityState.Modified更安全,避免意外覆盖未提交的属性):
public ActionResult Aggiorna(Anagrafica _entity) { // 验证模型合法性 if (!ModelState.IsValid) { return View("FormModifica", _entity); } ContestoDB _con = new ContestoDB(); var existingEntity = _con.Anagrafica.Find(_entity.IdAnagrafica); // 验证目标实体是否存在 if (existingEntity == null) { return HttpNotFound(); } // 手动更新需要修改的字段 existingEntity.Nome = _entity.Nome; existingEntity.Cognome = _entity.Cognome; existingEntity.Sesso = _entity.Sesso; _con.SaveChanges(); // 保存后跳转回列表页面 return RedirectToAction("Lista"); }
内容的提问来源于stack exchange,提问作者MICHELE TROTTA
相关产品推荐
相关产品推荐

