You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Entity Framework中Aggiorna方法无法保存数据修改

EF中修改操作(Aggiorna方法)无法保存数据的解决办法

现有基于Entity Framework的项目中,创建、查询、删除Anagrafica数据的功能均正常,但点击修改页面的Salva按钮后,Aggiorna方法无法保存数据修改,以下是问题分析和解决方案:

问题根源

  1. FormModifica方法未加载目标实体:原方法未接收id参数,也未从数据库加载对应记录传递给视图,导致视图绑定的模型IdAnagrafica为默认值0。
  2. 视图未传递主键ID:仅用DisplayFor展示IdAnagrafica,未生成隐藏字段,提交表单时控制器无法获取目标记录的主键,EF无法定位要修改的条目。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:10:04