Entity Framework Core系列之DbContext(删除)
上一篇我们介绍了Entity Framework Core系列之DbContext(修改),这一篇我们介绍下删除数据
修改实体的方法取决于context是否正在跟踪需要删除的实体。
下面的示例中context获得了需要删除的实体对象,所以context会开始追踪这个实体。DbContext.Remove方法会将实体的EntityState设置成deleted。
context.Remove(context.Authors.Single(a => a.AuthorId == ));
context.SaveChanges();
当SaveChanges被调用时,数据库生成并执行delete语句
exec sp_executesql N'SET NOCOUNT ON;
DELETE FROM [Authors]
WHERE [AuthorId] = @p0;
SELECT @@ROWCOUNT;
',N'@p0 int',@p0=1
这种方法实际上执行了两个sql语句,一个用于从数据库检索实体,另一个用于删除实体,您可以使用存根来表示要删除的实体,从而停止从数据库检索的实体:
using (var context = new EFCoreContext())
{
var author = new Author { AuthorId = };
context.Remove(author);
context.SaveChanges();
}
存根需要的唯一属性是主键值。
设置EntityState
可以通过EntityEntry显式地设置要删除的实体的EntityState的属性值
using (var context = new EFCoreContext())
{
var author = new Author { AuthorId = };
context.Entry(author).State = EntityState.Deleted;
context.SaveChanges();
}
多个相关实体
如果需要删除的实体有关联的数据,那就看这些关系是如何配置的,一个完全定义的关系将具有一个级联引用约束集来删除或SetNull,通过Fluent API配置的关系也是如此。在这些情况下,您可以删除主体并让数据库处理相关的行。当引用约束动作被设置为NoAction时,您需要显式地处理所有相关数据。下一个示例演示了在不包含外键属性的模型上配置的关系:
public class Author
{
public int AuthorId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public ICollection<Book> Books { get; set; }
} public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
}
默认情况下,此关系被配置为可选的,引用约束操作选项被配置为NoAction。此外,EF Core引入了一个影子属性来表示外键。它被命名为AuthorId,并应用于Book实体,由于关系是可选的,所以AuthorId属性可以为nullable。为了删除Author,你需要删除每个Book和Author之间的关系。代码如下:
using (var context = new EFCoreContext())
{
var author = context.Authors.Single(a => a.AuthorId == );
var books = context.Books.Where(b => EF.Property<int>(b, "AuthorId") == );
foreach (var book in books)
{
author.Books.Remove(book);
}
context.Remove(author);
context.SaveChanges();
}
从数据库中检索Author,和它相关的Books也就被检索出来然后再逐一被remove出集合,然后执行context.Remove(author),最后结果会使相关的Book中的AuthorId设置成null。
exec sp_executesql N'SET NOCOUNT ON;
UPDATE [Books] SET [AuthorId] = @p0
WHERE [BookId] = @p1;
SELECT @@ROWCOUNT;
UPDATE [Books] SET [AuthorId] = @p2
WHERE [BookId] = @p3;
SELECT @@ROWCOUNT;
UPDATE [Books] SET [AuthorId] = @p4
WHERE [BookId] = @p5;
SELECT @@ROWCOUNT;
',N'@p1 int,@p0 int,@p3 int,@p2 int,@p5 int,@p4 int',@p1=1,@p0=NULL,@p3=2,@p2=NULL,@p5=3,@p4=NULL
exec sp_executesql N'SET NOCOUNT ON;
DELETE FROM [Authors]
WHERE [AuthorId] = @p6;
SELECT @@ROWCOUNT;
',N'@p6 int',@p6=1
数据库执行了四次操作:查询Author,查询Book,更新Book,删除Author,因此,使用引用完整性约束将外键设置为null或删除依赖项是一个好主意o。
Entity Framework Core系列之DbContext(删除)的更多相关文章
- Entity Framework Core系列之DbContext
前言: EF Core DbContext表示与数据库的会话,并提供与数据库通信的API,具有以下功能: 数据库连接 数据操作,如查询和持久化 更改追踪 模型构建 数据映射 对象缓存 事务管理 数据库 ...
- Entity Framework Core系列之DbContext(修改)
上一篇我们介绍了Entity Framework Core系列之DbContext(添加),这一篇我们介绍下修改数据 修改实体的方法取决于context是否正在跟踪需要修改的实体. 下面的示例中实体由 ...
- Entity Framework Core系列之DbContext(添加)
上一篇我们介绍了Entity Framework Core系列之DbContext,对DbContext有了概念上的了解,这篇将介绍DbContext添加数据 通过DbContext添加实体的主要方法 ...
- Entity Framework Core系列之什么是Entity Framework Core
前言 Entity Framework Core (EF Core)是微软推荐的基于.NET Core framework的应用程序数据访问技术.它是轻量级,可扩展并且支持跨平台开发.EF Core是 ...
- Entity Framework Core(3)-配置DbContext
设计时 DbContext 配置 EF Core 设计时工具如迁移需要能够发现和创建的工作实例DbContext以收集有关应用程序的实体类型以及它们如何映射到数据库架构的详细信息的类型. 此过程可以为 ...
- Entity Framework Core系列之实战(ASP.NET Core MVC应用程序)
本示例演示在ASP.NET 应用程序中使用EF CORE创建数据库并对其做基本的增删改查操作.当然我们默认你的机器上已经安装了.NET CORE SDK以及合适的IDE.本例使用的是Visual St ...
- Entity Framework Core 软删除与查询过滤器
本文翻译自<Entity Framework Core: Soft Delete using Query Filters>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意 ...
- 【EF】Entity Framework Core 软删除与查询过滤器
本文翻译自<Entity Framework Core: Soft Delete using Query Filters>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意 ...
- ASP.NET CORE系列【六】Entity Framework Core 之数据迁移
原文:ASP.NET CORE系列[六]Entity Framework Core 之数据迁移 前言 最近打算用.NET Core写一份简单的后台系统,来练练手 然后又用到了Entity Framew ...
随机推荐
- [国家集训队] Crash的文明世界
Description 给定一棵 \(n\) 个点的树,对于每个点 \(i\) 求 \(S(i)=\sum\limits_{j=1}^n \operatorname{dist(i,j)}^k\) .\ ...
- Android ios嵌套web页面
我们现在做一个活动页面,Android和ios的活动页面用web来做,方便更改,下面有几个小问题: 1.在Android和ios中,虽然web上面可以存localstorage,但是到了Android ...
- Redis in python
什么是Redis 数据库类型分为两种,关系型和非关系型,Redis是一个非常重要的非关系型数据库. 既然是数据库,就是存储数据的一个空间,或者说是一个软件,非关系就是不再按照一对一多对多等结构进行外键 ...
- 大型网站架构演进(6)使用NoSQL和搜索引擎
随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂,网站需要采用一些非关系型数据库技术(即NoSQL)和非数据库查询技术如搜索引擎.NoSQL数据库一般使用MongoDb,搜索引擎一般使用El ...
- 基于GIS的视频管理指挥平台
平台利用空间地理信息技术,以GIS地图为基础,将各类信息空间化.可视化,实现基于空间电子地图的可视化查询和分析,它能使情报.推理.分析与其他可用数据融为一体,提供依托于电子地图的清晰而精确的现场态势图 ...
- Android程序员的Flutter学习笔记
作为忠实与较资深的Android汪, 最近抽出了一些时间研究了一下Google的亲儿子Flutter, 尚属皮毛, 只能算是个简单的记录吧. Google自2017年第一次提出Flutter, 到20 ...
- MySQL外键设置中的的 Cascade、NO ACTION、Restrict、SET NULL
例如: ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo FOREIGN KEY(gradeid) REFERENCES grade(id) ON DELET ...
- Go-Ethereum 1.7.2 结合 Mist 0.9.2 实现众筹合约的实例
目录 目录 1.什么是ICO? 2.众筹的奖励-代币 3.众筹合约的完善 3.1.设置众筹合约中使用的代币 3.2.众筹合约的基本设置 3.3.让众筹合约接收以太币 3.4.检测众筹合约是否完成 3. ...
- 第五周课后作业——热门软件创新分析+附加题1&附加题3
鉴于我们寝室都热衷于手游,所以本次热门软件创新分析我就来分析一下几款热门的抽卡型手游. 阴阳师(后文简称YYS)——剧情画风唯美,配音引人入胜 作为网易公司研发的一款3D日式和风回合制游戏,YYS ...
- 【公众号系列】超详细SAP HANA JOB全解析
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]超详细SAP HANA JOB全解 ...