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
相关产品推荐
相关产品推荐

