龙空技术网

Entity Framework Core-删除数据

opendotnet 188

前言:

现在看官们对“数据库条件删除语句”大致比较关心,兄弟们都想要分析一些“数据库条件删除语句”的相关资讯。那么小编也在网上搜集了一些对于“数据库条件删除语句””的相关知识,希望看官们能喜欢,小伙伴们一起来学习一下吧!

实体状态EntityState设置了Deleted,EF Core API在数据库中执行删除语句,使用DbContext的Remove()方法删除数据库中的数据

1 删除单条数据下面代码我们删除Id=3 的Department

var dept = new Department(){ Id = 3};context.Remove(dept);await context.SaveChangesAsync();
调用Remove()方法,EF Core标记部门Id为3的数据的EntityState 状态为Deleted, 调用SaveChangesAsync()方法将部门Id为3的数据从数据库中删除2 删除多条数据使用DbContext的RemoveRange() 方法删除多条数据,下面代码分别删除Id为1,2,3的Department
List<Department> dept = new List<Department>(){ new Department() { Id=1 }, new Department() { Id=2 }, new Department() { Id=3 }};context.RemoveRange(dept);await context.SaveChangesAsync();
执行Remove()或RemoveRange()方法时如果指定的Id不存,EF Core将会抛出一个DbUpdateConcurrencyException的异常如果一个实体引用了另外一个实体,例如:一对一或者一对多关系,当父实体删除时,子实体将会受影响,这时子实体有两种选择,一是删除对应的子实体,二是将子实体外键设置为,在EF Core中我们称之为级联删除借助EF Core Fluent API,我们可以定义4种级联删除的行为:

1. Cascade:当父实体删除时引用的实体也会删除

2. ClientSet:将外键默认值设置为

3. Restrict:阻止级联删除

4. Set:外键属性值设置为

打开应用程序的DbContext文件,设置OnDelete()方法为Cascade,DeleteBehavior枚举中定义了四种类型,分别为:Cascade, ClientSet, Restrict, Set

protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity<Employee>(entity => { entity.HasOne(d => d.Department) .WithMany(p => p.Employee) .HasForeignKey(d => d.DepartmentId) .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("FK_Employee_Department"); });}

我们需要重新运行一下migration 提交该行为

现在我们删除Department表中的数据,所有关联的Employee表的数据也会被删除,这是因为Department是父实体,Employee是子实体

下面代码删除Id为5的Department,因此该department下所有的employee会自动删除

var dept = new Department() { Id = 5 };context.Remove(dept);await context.SaveChangesAsync();
3 EF Core CRUD 操作– 删除数据

我们来完成CRUD操作中的Delete功能

Index视图显示所有实体,在Index视图的table内添加删除列,删除列将包含删除按钮,用户点击删除按钮,表单将提交并调用删除方法,EF Core 将会删除该数据

我们修改一下Views/Department 目录下的 Index.cshtml 文件

@{ 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> <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> <td> <form asp-action="Delete" asp-route-id="@dept.Id" method="post"> <button type="submit" class="btn btn-sm btn-danger"> 删除 </button> </form> </td> </tr> } </tbody> </table> </div> </div></div>

删除列将显示如下:

接下来在DepartmentController.cs 文件中添加Delete 方法,代码如下:

[HttpPost]public async Task<IActionResult> Delete(int id){ var emp = new Department() { Id = id }; context.Remove(emp); await context.SaveChangesAsync(); return RedirectToAction("Index");}
我们给Employee实体做相同的事情,在Index视图下添加删除按钮
@{ 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> <td>删除</td> </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> <td> <form asp-action="Delete" asp-route-id="@emp.Id" method="post"> <button type="submit" class="btn btn-sm btn-danger"> 删除 </button> </form> </td> </tr> } </tbody> </table> </div> </div></div>

接下来在EmployeeController.cs 文件中添加Delete 方法,代码如下

 [HttpPost]public async Task<IActionResult> Delete(int id){ var emp = new Employee() { Id = id }; context.Remove(emp); await context.SaveChangesAsync(); return RedirectToAction("Index"); }

运行应用程序浏览器输入 地址,这里我们看到每一个员工记录旁边都有一个删除按钮,点击任何一个删除按钮将删除员工

总结

在这节中学习了如何在EF Core 中删除数据,覆盖了单条和多条删除,也学习了级联删除概念并且完成了CRUD 操作中的删除功能源代码地址:

参考资料

标签: #数据库条件删除语句