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

编辑数据库记录时误新增,EF中Update方法不被VS识别的问题求助

问题分析与解决步骤

咱们先拆解你遇到的两个核心问题:编辑时意外新增记录,以及Update方法不被识别的原因,再一步步给出解决方案。

一、为什么编辑操作会意外新增记录?

你之前用db.NewsPortals.Add(image);,这个方法的核心作用是把实体标记为新增状态(Added)——不管这个实体有没有主键ID,EF都会生成插入语句。哪怕你从数据库查到了原有记录,只要调用Add,就会触发新增操作,这就是问题的根源。

二、为什么Visual Studio识别不了Update方法?

这完全取决于你使用的Entity Framework版本:

  • 如果你用的是EF 6或更早版本,DbSet<T>根本没有Update方法!这个方法是Entity Framework Core才引入的特性。EF 6里的更新逻辑靠的是上下文的变更追踪,不需要显式调用Update来触发。

三、正确的编辑代码修改方案

针对EF 6的场景,你可以按以下步骤调整代码:

步骤1:确保加载被上下文追踪的实体

你已经写了var image = db.NewsPortals.Find(id);,这一步没问题——通过Find获取的实体是被当前上下文追踪的,接下来只要修改它的属性即可。

步骤2:把ViewModel的属性赋值给实体

不要直接替换image为新对象,而是把model里的有效属性逐个赋值给从数据库查到的image,比如:

// 示例:根据你的ViewModel实际属性调整
image.PortalTitle = model.PortalTitle;
image.Description = model.Description;
// 处理图片上传逻辑(如果有需要的话)
if (model.ImageFile != null && validImageTypes.Contains(model.ImageFile.ContentType))
{
    // 这里写入图片保存、更新image对应字段的逻辑
}

步骤3:保存变更

不需要调用Add或Update,直接调用SaveChanges即可——因为上下文已经追踪到image的属性变化,会自动生成Update语句:

db.SaveChanges();
return RedirectToAction("Index");

特殊情况:如果实体不是从当前上下文加载的

如果你是手动创建了NewsPortal实例(而非通过Find/FirstOrDefault从数据库获取),那需要手动设置实体状态为修改:

db.Entry(image).State = EntityState.Modified;
db.SaveChanges();

不过这种方式容易覆盖未修改的属性,不如先加载原有实体再修改更安全。

内容的提问来源于stack exchange,提问作者Ivan Šitina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:40:48