.NET Core 更新部分字段方法总结
一、利用TryUpdateModelAsync
此方法首先查询出实体数据,然后根据lambda表达式中的字段进行更新对应的实体字段,注意lambda表达式,都为这样的参数格式o=>o.x1,o=>o.x2而不是o=>o.x1,o.x2
[ValidateAntiForgeryToken]
public async Task<ActionResult> EditAsync(int? id)
{
if (id ==null)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
var q = dbContext.LeaveRecord.Find(id);
if (await TryUpdateModelAsync(q, "", o => o.PersonName, o => o.LeaveType, o => o.Sex))
{
await dbContext.SaveChangesAsync();
}
}
catch
{
return View();
}
return RedirectToAction(nameof(Index));
}
return View();
}
二、查询出实体,然后将表单form中的实体字段值赋给查询出来的实体对应字段
[ValidateAntiForgeryToken] public ActionResult EditAsync(int? id, LeaveRecord leaveRecord) { if (id ==null) { return NotFound(); } if (ModelState.IsValid) { try { var q = dbContext.LeaveRecord.Find(id); q.PersonName = leaveRecord.PersonName; q.Sex = leaveRecord.Sex; q.LeaveType = leaveRecord.LeaveType; q.LeaveReason = leaveRecord.LeaveReason; dbContext.Update(q); dbContext.SaveChanges(); } catch { return View(); } return RedirectToAction(nameof(Index)); } return View(); }
三、字段绑定更新部分,将所有字段值读出来,然后在html中将不更新的字段设置为readonly,这样用户只能操作需要更新的字段值,但这也有一个问题,如果用户懂计算机,将实体在html中的readonly去掉,会导致后台更新数据 的同时会把值更新
<input type="text" readonly asp-for="Title" />
五、如果更新字段较多,上面的方法都要写一堆需要更新字段的代码,假如有10个字段,更新9个,仅有一个字段不更新,那么,可以用以下方法,此方法适用总字段较多,但更新的字段较少的情况,和上面的正好相反。
dbContext.Entry(user).State = EntityState.Modified;//将所有字段设置为要更新的状态
dbContext.Entry(user).Property(o=>o.UserName).IsModified = false;//再将不需要的字段设置为不更新,那么这样就达到了更新多个字段,除此字段外
注意:第四、五方法中用了Attach,所以在SaveChanges()前面一定不要再加dbContext.Update(user);加上此句会出错,导致上面的设置状态无效,会全部更新,所以一定不要加。
六、使用原生SQL执行更新操作
dbContext.Database.ExecuteSqlRaw("sql语句",参数1值, 参数2值,...);
public ActionResult Edit(int id, User user) { try { dbContext.Database.ExecuteSqlRaw($"update User set userName='{user.UserName}',userpassword='{user.UserPassword}' where id={user.Id}"); return RedirectToAction(nameof(Index)); } catch (Exception ex) { return View(); } }
向原始 SQL 查询引入任何用户提供的值时,必须注意防范 SQL 注入攻击。 除了验证确保此类值不包含无效字符,请始终使用会将值与 SQL 文本分开发送的参数化处理。
具体而言,如果连接和内插的字符串 ($""
) 带有用户提供的未经验证的值,则切勿将其传递到 FromSqlRaw
或 ExecuteSqlRaw
。
通过 FromSqlInterpolated
和 ExecuteSqlInterpolated
方法,可采用一种能抵御 SQL 注入攻击的方式使用字符串内插语法。一般这种方法用于内部确定的更新操作。比如将某个字段更新为某个值等。
以上方法必须保证参数值是经过处理的,否则不建议用$""这样的形式。下面的两个方法进行参数化防止sql注入攻击:
- 第一种简写:
dbContext.Database.ExecuteSqlRaw("update User set userName={0},userpassword={1} where id={2}","user01","123123",3);//将id=3的user用户名和密码进行更新
- 第二种参数写法:参数化赋值
mysql用 MySqlParameter,sql用SqlParameter,注意对应关系否则出错,代码如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本