Entity Framework Core-删除数据

实体状态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的异常

如果一个实体引用了另外一个实体,例如:一对一或者一对多关系,当父实体删除时,子实体将会受影响,这时子实体有两种选择,一是删除对应的子实体,二是将子实体外键设置为null,在EF Core中我们称之为级联删除

借助EF Core Fluent API,我们可以定义4种级联删除的行为:

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

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

3. Restrict:阻止级联删除

4. SetNull:外键属性值设置为null

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

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>

删除列将显示如下:

e00f32046995c8aca6296f999b5a63b7.png

接下来在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");
 }

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

63b2edee2cdb1548ed305cada8bdb6cf.png总结

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

源代码地址:

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

参考资料

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值