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

ASP.NET Core MVC:ViewModel列表更新数据库报错求助

解决EF中List无法直接传入Update方法的问题

你遇到的错误核心原因是:Entity Framework的DbSet.Update()方法仅支持传入单个实体对象,而你传入的是List<VykonyVykazyTmpModel>集合,类型不匹配导致转换失败。

以下是几种可行的解决方案:

方案1:遍历集合逐个更新(适用于所有实体均为已存在记录)

如果确定列表中的所有VykonyVykazyTmpModel实体都已存在于数据库中,直接遍历集合逐个调用Update即可:

public IActionResult VykazKlientSave(VykazyViewModel vykaz)
{
    _db.Vykazy.Add(vykaz.VykazyModel);
    _db.SaveChanges();

    // 遍历列表,对每个实体执行更新
    foreach (var tmpModel in vykaz.VykazyListModel)
    {
        _db.VykonyVykazyTmp.Update(tmpModel);
    }
    _db.SaveChanges();  
}

方案2:区分新增/更新实体(适用于混合场景)

如果列表中同时包含新增(未存入数据库)和已存在的实体,可以通过主键(Id)判断,分别调用Add或Update:

public IActionResult VykazKlientSave(VykazyViewModel vykaz)
{
    _db.Vykazy.Add(vykaz.VykazyModel);
    _db.SaveChanges();

    foreach (var tmpModel in vykaz.VykazyListModel)
    {
        // 假设Id为0代表新增实体(根据你的主键生成策略调整)
        if (tmpModel.Id == 0)
        {
            _db.VykonyVykazyTmp.Add(tmpModel);
        }
        else
        {
            _db.VykonyVykazyTmp.Update(tmpModel);
        }
    }
    _db.SaveChanges();  
}

方案3:EF Core 7+批量更新(高效批量操作)

如果你使用的是EF Core 7及以上版本,可以利用ExecuteUpdate进行批量更新,避免遍历带来的性能开销(适合不需要加载实体的场景):

public IActionResult VykazKlientSave(VykazyViewModel vykaz)
{
    _db.Vykazy.Add(vykaz.VykazyModel);
    _db.SaveChanges();

    // 示例:根据主键批量更新实体字段(需根据实际业务调整筛选条件和更新逻辑)
    foreach (var tmpModel in vykaz.VykazyListModel)
    {
        _db.VykonyVykazyTmp
            .Where(v => v.Id == tmpModel.Id)
            .ExecuteUpdate(setters => setters
                .SetProperty(v => v.UserId, tmpModel.UserId)
                .SetProperty(v => v.Vykon, tmpModel.Vykon)
                // 其他需要更新的字段
            );
    }
    _db.SaveChanges();  
}

注意事项

  • 确保实体的主键(Id)有效:EF通过主键值定位数据库中的对应记录,若主键无效会导致更新失败或新增错误记录。
  • 批量更新时需注意筛选条件的准确性,避免误修改无关数据。

内容的提问来源于stack exchange,提问作者Jan Šalomoun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:55:08