Entity Framework Core-更新数据

当实体的EntityState设置为Modified时,EF Core在数据库中执行Update语句,使用DbContext类的Update 方法执行数据库更新操作
1 更新单条数据
下面代码使用number Id=1 更新部门名称,我们将部门名称更新为Designing.
var dept = new Department(){    Id = 1,    Name = "Designing"};context.Update(dept);await context.SaveChangesAsync();

EF Core 之所以能够更新这条数据是因为我们给Id设置值,department 通过实体跟踪来完成

1.1 Update()插入记录的场景
如果设置的Id是无效的EF Core将会向数据库中插入一条记录
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();
employee将它的信息更改为:
1 Name变更为"Matt_1"
2 Designation变更为"Head_1"
引用department的数据也发生改变,这个员工的部门名称修改为"Admin_1"

4 EF Core CRUD 操作– 更新数据

给CRUD功能添加Update特性,在DepartmentController中添加Update方法,代码如下:
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>

下面图片显示了更新部门表单     

Entity Framework Core-更新数据

我们在Index视图表单中添加一列修改
@{    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,每条部门记录旁边都会显示一个修更新按钮,点击修改按钮更新与其相匹配的记录,如下图所示:      

Entity Framework Core-更新数据

让我们在EmployeeController也添加一个Update 方法:
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 记录

查询所有的departments并且添加他们到List<SelectListItem>对象,赋值给ViewBag,部门将显示在选择下拉框中
List<SelectListItem> dept = new List<SelectListItem>();dept = context.Department.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() }).ToList();ViewBag.Department = dept;
接下来,在Views/Employee目录下添加Update.cshtml 视图,视图将在表单中显示要更新的员工的字段
@{    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>

更新员工表单展示如下:      

Entity Framework Core-更新数据最后我们在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>
运行应用程序访问https://localhost:7013/Employee地址,我们会看到每行记录都有一个修改连接,点击任何一个将更新employee

Entity Framework Core-更新数据

总结

在这节中我们学习了如何更新一条数据或者多条数据,也学习了更新相关的引用数据,在最后,我们创建了CRUD中的Update功能
源代码地址:
https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/EntityFrameworkCore/EFCoreUpdateRecords