优秀的编程知识分享平台

网站首页 > 技术文章 正文

Entity Framework Core-更新数据(更新.net framework)

nanyue 2024-07-30 03:42:27 技术文章 10 ℃
当实体的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>

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

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

让我们在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>

更新员工表单展示如下:

最后我们在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

总结

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

参考资料

https://www.yogihosting.com/update-records-entity-framework-core/

Tags:

最近发表
标签列表