var dept = new Department(){Id = 1,Name = "Designing"};context.Update(dept);await context.SaveChangesAsync();
EF Core 之所以能够更新这条数据是因为我们给Id设置值,department 通过实体跟踪来完成
var dept = new Department(){Name = "Research"};context.Update(dept);await context.SaveChangesAsync();
2 Update多条记录
如果我们同时更新多条数据可以使用UpdateRange() 方法,下面代码将同时更新3个Department记录
var dept1 = new Department(){Id = 1,Name = "New Designing"};var dept2 = new Department(){Id = 2,Name = "New Research"};var dept3 = new Department(){Id = 3,Name = "New HR"};List<Department> modifiedDept = new List<Department>() { dept1, dept2, dept3 };context.UpdateRange(modifiedDept);await context.SaveChangesAsync();
3 Update 引用数据
EF Core 也可以更新引用的数据,下面代码同时更新Employee和Department代码,把Department名称更新为"Admin_1" ,这个Department 是Employee引用的数据
var dept = new Department(){Id = 5,Name = "Admin_1"};var emp = new Employee(){Id = 1,Name = "Matt_1",Designation = "Head_1",Department = dept};context.Update(emp);await context.SaveChangesAsync();
4 EF Core CRUD 操作– 更新数据
using EFCoreReadRecords.Models;using EFCoreUpdateRecords.Models;using Microsoft.AspNetCore.Mvc;using Microsoft.EntityFrameworkCore;namespace EFCoreReadRecords.Controllers{public class DepartmentController : Controller{private CompanyContext context;public DepartmentController(CompanyContext cc){context = cc;}public async Task<IActionResult> Update(int id){var dept = await context.Department.Where(e => e.Id == id).FirstOrDefaultAsync();return View(dept);}[HttpPost]public async Task<IActionResult> Update(Department dept){context.Update(dept);await context.SaveChangesAsync();return RedirectToAction("Index");}//.....}}
我们添加了2个action方法,分别是HTTP GET版本和HTTP POST版本,在GET版本的Update方法参数获取部门Id并且从数据库中查询与其匹配的部门,之后将数据返回到更新视图,在表单中显示给用户
用户将更新部门的值并提交表单,将会调用POST版本的Update方法并且该方法通过模型绑定接受修改后的department值,接着我们会调用Update()方法,通过使用SaveChangesAsync() 方法将数据保存到数据库中,接下来我们在Views/Department 文件夹下添加一个Update.cshtml文件
@{ViewData["Title"] = "修改部门";}@model Department<form class="form-horizontal" role="form" method="post"><div class="mb-3 row"><label asp-for="Name" class="col-sm-1 control-label"></label><div class="col-sm-11"><input asp-for="Name" class="form-control" /></div></div><div class="mb-3 row"><div class="col-sm-11 offset-sm-1"><button type="submit" class="btn btn-primary">保存</button><button asp-action="Index" class="btn btn-secondary">返回</button></div></div></form>
下面图片显示了更新部门表单

@{ViewData["Title"] = "部门数据";}@model IEnumerable<Department><div class="container"><div class="row mb-3"><div class="col-sm-3"><a asp-action="Create" class="btn btn-secondary">新增</a></div><div class="col-sm-3"></div><div class="col-sm-3"></div><div class="col-sm-3"></div></div><div class="row mb-3"><div class="col-sm"><table class="table table-bordered align-middle"><thead><tr><th>编号</th><th>名称</th><th>修改</th></tr></thead><tbody>@foreach (Department dept in Model){<tr><td>@dept.Id</td><td>@dept.Name</td><td><a class="btn btn-sm btn-primary" asp-action="Update" asp-route-id="@dept.Id">修改</a></td></tr>}</tbody></table></div></div></div>
运行应用程序并访问https://localhost:7013/Department,每条部门记录旁边都会显示一个修更新按钮,点击修改按钮更新与其相匹配的记录,如下图所示:

using EFCoreReadRecords.Models;using EFCoreUpdateRecords.Models;using Microsoft.AspNetCore.Mvc;using Microsoft.AspNetCore.Mvc.Rendering;using Microsoft.EntityFrameworkCore;namespace EFCoreReadRecords.Controllers{public class EmployeeController : Controller{private CompanyContext context;public EmployeeController(CompanyContext cc){context = cc;}public async Task<IActionResult> Update(int id){var emp = await context.Employee.Where(e => e.Id == id).FirstOrDefaultAsync();List<SelectListItem> dept = new List<SelectListItem>();dept = context.Department.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() }).ToList();ViewBag.Department = dept;return View(emp);}[HttpPost]public async Task<IActionResult> Update(Employee emp){context.Update(emp);await context.SaveChangesAsync();return RedirectToAction("Index");}//......}}
和department控制器更新方法相似,我们将做相同的事情,通过方法参数提供的Id查找employee 记录
List<SelectListItem> dept = new List<SelectListItem>();dept = context.Department.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() }).ToList();ViewBag.Department = dept;
@{ViewData["Title"] = "修改员工";}@model Employee<form method="post"><div class="mb-3 row"><label asp-for="Name" class="col-sm-1 control-label"></label><div class="col-sm-11"><input asp-for="Name" class="form-control" /></div></div><div class="mb-3 row"><label asp-for="Department" class="col-sm-1 control-label"></label><div class="col-sm-11"><select asp-for="DepartmentId" asp-items="ViewBag.Department" class="form-control"></select></div></div><div class="mb-3 row"><label asp-for="Designation" class="col-sm-1 control-label"></label><div class="col-sm-11"><input asp-for="Designation" class="form-control" /></div></div><div class="mb-3 row"><div class="col-sm-11 offset-sm-1"><button type="submit" class="btn btn-primary">保存</button><button asp-action="Index" class="btn btn-secondary">返回</button></div></div></form>
更新员工表单展示如下:
最后我们在EmployeeController的Index视图中为Table每行添加一个修改连接,具体代码如下:
@{ViewData["Title"] = "所有员工";}@model IEnumerable<Employee><div class="container"><div class="row mb-3"><div class="col-sm-3"><a asp-action="Create" class="btn btn-secondary">新增</a></div><div class="col-sm-3"></div><div class="col-sm-3"></div><div class="col-sm-3"></div></div><div class="row mb-3"><div class="col-sm"><table class="table table-bordered align-middle"><thead><tr><th>编号</th><th>姓名</th><th>职务</th><th>部门</th><th>修改</th></tr></thead><tbody>@foreach (Employee emp in Model){<tr><td>@emp.Id</td><td>@emp.Name</td><td>@emp.Designation</td><td>@emp.Department.Name</td><td><a class="btn btn-sm btn-primary" asp-action="Update" asp-route-id="@emp.DepartmentId">修改</a></td></tr>}</tbody></table></div></div></div>

总结