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>

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

8c406aa377dcaf8e01991ceded9be406.png

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

4ade5f6db36e991ccaedffa45e805bdb.png

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

更新员工表单展示如下:      

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

66c805f2d02fbfb1f590d41b1a93eada.png

总结

在这节中我们学习了如何更新一条数据或者多条数据,也学习了更新相关的引用数据,在最后,我们创建了CRUD中的Update功能

源代码地址:

https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/EntityFrameworkCore/EFCoreUpdateRecords

参考资料

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值