Entity Framework Core系列教程-18-断开模式下删除数据

2023-11-02

Entity Framework Core 断开模式下删除数据

EF Core API会为EntityState为Deleted的实体建立并执行数据库中的DELETE语句。在EF Core中已连接和已断开连接的场景中删除实体没有什么区别。 EF Core使得从上下文中删除实体变得容易,而上下文又将使用以下方法删除数据库中的记录。

DbContext 方法 DbSet 方法 描述
DbContext.Remove DbSet.Remove 将指定的实体附加到状态为“已删除”的DbContext并开始对其进行跟踪
DbContext.RemoveRang DbSet.RemoveRange 将实体的集合或数组附加到具有Deleted状态的DbContext并开始跟踪它们

以下示例演示了在断开连接的场景中删除实体的不同方法:

// entity to be deleted
var student = new Student() {
        StudentId = 1
};

using (var context = new SchoolContext()) 
{
    context.Remove<Student>(student);
   
    // or the followings are also valid
    // context.RemoveRange(student);
    //context.Students.Remove(student);
    //context.Students.RemoveRange(student);
    //context.Attach<Student>(student).State = EntityState.Deleted;
    //context.Entry<Student>(student).State = EntityState.Deleted;
    
    context.SaveChanges();
}

在上面的示例中,使用Remove()或RemoveRange()方法从上下文中删除了具有有效StudentId的Studnet实体。数据将从SaveChanges()上的数据库中删除。上面的示例在数据库中执行以下delete命令:

exec sp_executesql N'SET NOCOUNT ON;
DELETE FROM [Students]
WHERE [StudentId] = @p0;
SELECT @@ROWCOUNT;
',N'@p0 int',@p0=1
go

注意:EF Core中新引入了DbContext.Remove()和DbContext.RemoveRange()方法,以简化删除操作。

异常

如果相应数据库表中不存在Remove()或RemoveRange()方法中指定实体中的Key值,则EF Core将引发异常:以下示例将引发异常。

var student = new Student() {
    StudentId = 50
};

using (var context = new SchoolContext()) {
    context.Remove<Student>(student);
    context.SaveChanges();
}

在上面的示例中,数据库中不存在StudentId = 50的Student。因此,EF Core将引发以下DbUpdateConcurrencyException:

Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded.
数据库操作预期会影响1行,但实际上会影响0行。自加载实体以来,数据可能已被修改或删除。

因此,您需要适当地处理以上异常,或者在删除ID之前确保数据库中存在具有ID的对应数据。

var student = new Student() {
    StudentId = 50
};

using (var context = new SchoolContext()) 
{
    try
    {
        context.Remove<Student>(deleteStudent);
        context.SaveChanges();
    }    
    catch (DbUpdateConcurrencyException ex)
    {
        throw new Exception("数据库中不存在此纪录");
    }
    catch (Exception ex)
    {
        throw;
    }
}

删除多条记录

您可以使用DbContext.RemoveRange()或DbSet.RemoveRange()方法一次性删除多个实体。

IList<Student> students = new List<Student>() {
    new Student(){ StudentId = 1 },
    new Student(){ StudentId = 2 },
    new Student(){ StudentId = 3 },
    new Student(){ StudentId = 4 }
};

using (var context = new SchoolContext()) 
{
    context.RemoveRange(students);
    
    // or
    // context.Students.RemoveRange(students);
    
    context.SaveChanges();
}

上面的示例将在单个数据库行程中从数据库中删除4条记录。因此,EF Core改善了性能。

exec sp_executesql N'SET NOCOUNT ON;
DELETE FROM [Students]
WHERE [StudentId] = @p0;
SELECT @@ROWCOUNT;


DELETE FROM [Students]
WHERE [StudentId] = @p1;
SELECT @@ROWCOUNT;

DELETE FROM [Students]
WHERE [StudentId] = @p2;
SELECT @@ROWCOUNT;


DELETE FROM [Students]
WHERE [StudentId] = @p3;
SELECT @@ROWCOUNT;

',N'@p0 int,@p1 int',@p0=1,@p1=2,@p2=3,@p3=4
go

删除关联数据

如果一个实体与其他实体有一对一或一对多的关系,则在删除根实体时删除相关数据取决于如何配置该关系。
例如,考虑“学生”和“年级”实体之间存在一对多关系。特定的GradeId将有许多学生记录。如果我们尝试删除数据库中具有相关学生记录的成绩,EF将抛出参考完整性错误。要解决此问题,您可以使用Fluent API定义引用约束操作选项。例如,您可以为该关系配置一个级联删除选项,如下所示。

modelBuilder.Entity<Student>()
    .HasOne<Grade>(s => s.Grade)
    .WithMany(g => g.Students)
    .HasForeignKey(s => s.GradeId)
    .OnDelete(DeleteBehavior.Cascade);

现在,如果您删除成绩实体,那么所有相关的学生记录也将在数据库中删除。
EF Core中还有其他引用约束操作选项,例如SetNull,ClientSetNull和Restrict。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Entity Framework Core系列教程-18-断开模式下删除数据 的相关文章

  • 包管理工具详解npm、yarn、cnpm、npx 发布npm包 npm install以及npm uninstall各参数含义 package文件和package-lock文件内常见配置含义

    1 包查找地址 包地址 2 配置文件 创建 文件名不能有中文 必须配置 其他配置 及版本号 3 npm命令 4 yarn 5 cnpm 6 npx 7 package lock json文件 8 npm i 的查找规则 9 如何发布包 1
  • channel-wise卷积--学习笔记

    背景 分组卷积的分组思想会导致channel间的信息阻隔 为了增加分组间的channel信息交流 一般需要添加一个融合层 一般网络最后都使用全局池化和全连接层进行最后的分类 但参数量巨大 可转化为深度可分离卷积 使用固定权重的深度卷积代替全
  • 安全测试基础知识

    软件安全测试是评估和测试系统以发现系统及其数据的安全风险和漏洞的过程 没有通用术语 但出于我们的目的 我们将评估定义为分析和发现漏洞 而不尝试实际利用这些漏洞 我们将测试定义为发现和尝试利用漏洞 安全测试通常根据要测试的漏洞类型或正在执行的
  • 2.4g无线跳频(三)

    2 4g无线跳频 三 一 跳频过程分析 1 主从建立连接 开启定时器 2 对于主机 每个定时周期内 前部分处于发送模式 后部分处于接收模式 对于从机 每个定时周期内 前部分处于接收模式 后部分处于发送模式 发送时间应安排小于接收时间 3 主
  • building for iOS Simulator, but linking in object file built for iOS, for architecture arm64

    Xcode 12以及以上版本 使用模拟器编译 使用真机不会报错 或者使用真机编译会报错 使用模拟器不会报错 ld in Users xxx Documents work svn EM iOS xxx xxx WarehouseMap Ext
  • AsposeWord转pdf的正确姿势

    通过国内国外 官网不断查找 终于找到适合java的开发的方式 不管国内国外 全是C 和vb net的资料 为了让自己以后不会忘记 迭代更新一下Aspose的多样性操作 普通的 File file new File C Users a Dow

随机推荐

  • Thinkphp5之多语言

    给需要的人看 自己总结的 大神请勿喷 谢谢 目录结构 配置 控制器 view zh cn return array test gt 中文 name gt 萧风 cn us return array test gt English name
  • Java多线程:高并发下数据插入重复问题

    转自 微点阅读 https www weidianyuedu com 1 背景描述 应用框架 Spring SpringMVC Hibernate 数据库 Oracle11g 一家文学网站向我系统推多线程低并发推送数据 我这边观察日志和数据
  • Ubuntu 16.04 pycharm设置桌面快捷启动方式

    Ubuntu下所有的快捷方式都在 usr share applications 解压 这里我将pycharm下载并解压到了 home snakeson developer文件夹下 这里的pycharm sh是批处理执行文件 prcharm
  • linux设置定时任务(crontab)操作步骤

    1 登录服务器 2 输入密码 登录成功 3 查看定时器任务 crontab l 4 编辑定时器任务 crontab e 5 保存定时器任务 1 按住sec退出 2 按住shift 再按 wq 保存并退出 备注 按住shift 再按 q 强制
  • CSS flex布局最后一个元素的宽度铺满剩余的空间

    当你希望最后一个元素的宽度铺满剩余的空间是 你可以为他设计一下属性 flex grow 1 例子 div div class sma1 div div class sma2 div div big width 200px height 10
  • [1114]mysql-connector-java各种版本下载地址

    mysql connector java下载地址 http mvnrepository com artifact mysql mysql connector java 1 进去后选择自己的版本 2 然后再点击 需要下载其他的jar包 或者依
  • 彻底解决虚拟机浏览器设置、扩展等花屏空白不显示问题

    问题现象 在我们日常使用VirtualBox vmware workstation Hyper V虚拟机软件的时候 不知不觉我们有没有遇到这种情况 chrome浏览器或者win10 win11自带的Edge浏览器的设置栏 浏览器标签预览 浏
  • Java实现 LeetCode 575 分糖果(看看是你的长度小还是我的种类少)

    575 分糖果 给定一个偶数长度的数组 其中不同的数字代表着不同种类的糖果 每一个数字代表一个糖果 你需要把这些糖果平均分给一个弟弟和一个妹妹 返回妹妹可以获得的最大糖果的种类数 示例 1 输入 candies 1 1 2 2 3 3 输出
  • Unity Navigation详解

    Unity Navigation详解 前言 从事unity相关行业以来始终看不清自己的路该怎么走 到今天才明白不需要花时间去迷茫 只管努力莫问前程 从今天开始每天写一点小东西 记录与整理自己走过的路 也一边寻找自己的路 便从unity的自动
  • BuildaFlightTrackerwithCesiumforUnreal_译

    BuildaFlightTrackerwithCesiumforUnreal 译 这个教程会使用真实世界飞机数据控制一个飞机飞过从圣弗朗西斯科到哥本哈根 你会学到怎样 1 输入真实数据到UnrealEngine 2 使用数据和USpline
  • 活动如何造势推广?会议软件帮您忙

    会议管理者辛苦策划了一场活动 如果推广宣传跟不上 那策划的心血岂不白费 如何使用有效且高效的方法为活动推广造势呢 传统推广方式耗费人力大 成本高 但通过会议软件便可以快速推广活动并有效宣传 下面为您介绍如何使用会议软件实现有效推广 01 社
  • python开发面试题

    python基础 1 Python类中的方法类型 在Python类中有四种方法类型 分别是实例方法 静态方法 类方法和普通方法 实例方法 即对象方法 需要实例化对象之后才能调用 接受的第一个参数self就是对象本身 必须使用实例化对象才可以
  • linux 图形分区工具,Linux下的图形分区工具

    在Linux下的许多情况下 分区将不足 这时 我们将需要调整分区 Windows下有很多工具 Linux下也有 您可以使用gparted进行分区 Gparted是parted的前端 图形化 linux下分区工具 通常包含在官方资源中 可以直
  • 2020年校赛网络赛

    51假期那段时间因为水了一段时间的数模校赛 加上专业课的坑越欠越多 因而已经很久很久没有补过题目了 从近到远 先把西电校赛的坑填起来 再把之前的CF牛客Atcoder补起来 qaq C 发现交换律后就显然了 D 双指针 好像第一天晚上还有个
  • 蓝桥杯2022真题:统计子矩阵、字符统计、排列字母、顺子日期、特殊时间、三角回文数、2022、星期计算

    目录 1 统计子矩阵 2 字符统计 3 排列字母 4 顺子日期 5 特殊时间 6 三角回文数 7 2022 8 星期计算 1 统计子矩阵 import os import sys 请在此输入您的代码 n m k map int input
  • chrome扩展结构

    每个打开的页面都运行在web页面环境中 一个正常的web页面环境 会先初始化css 然后建立DOM树 接着加载图片和frame等子资源 然后顺序执行所有js l chrome扩展本身运行在一个进程中 称之为background环境 back
  • 【软件测试学习笔记】白盒测试

    文章目录 一 白盒测试概述 二 分类 1 静态测试 2 动态测试 三 白盒测试原则 四 白盒测试类别 五 不同阶段不同侧重点 1 单元测试 2 集成测试 3 系统测试 4 验收测试 六 测试覆盖率 1 功能点覆盖 2 结构覆盖率 七 逻辑覆
  • LVGL在linux环境搭建篇

    LVGL环境搭建 1 环境准备 1 下载源码 https github com lvgl lvgl https github com lvgl lvgl 2 新建lvgl 文件夹 把src 和lvgl h 和lv conf template
  • 疯狂的采药(完全背包例题详解)

    题目 每种草药可以无限制地采摘 每种草药对应采药时间 草药价值 求在一定的采药时间下 采出的药最大总价值是多少 输入格式 输入第一行有两个整数 分别代表总共能够用来采药的时间 t 和代表山洞里的草药的数目 m 第 2 到第 m 1 行 每行
  • Entity Framework Core系列教程-18-断开模式下删除数据

    Entity Framework Core 断开模式下删除数据 EF Core API会为EntityState为Deleted的实体建立并执行数据库中的DELETE语句 在EF Core中已连接和已断开连接的场景中删除实体没有什么区别 E