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>
总结
参考资料