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 ...
随机推荐
- [angularjs] AngularJs 知识回顾
AngularJs 知识回顾 简介 1.通过指令扩展了 HTML,通过表达式绑定数据到 HTML: 2.一个 Js 框架: 3.指令: 通过被称为 指令 的新属性来扩展 HTML, 即为应用添加新功能 ...
- [PHP] pow指数运算函数与二进制
1.a的-2次方=(a分之一)的2次方2.-a的2次方 3次方 按照这个规则,负负得正,负正得负,正正得正,指数是偶数最终结果是正的,是奇数就是负的3.二进制转换十进制,0b开头是二进制 <?p ...
- Java开发笔记(二十一)二维数组的扩展
前面介绍的数组容纳的是一串数字,仿佛一根线把这组数字串了起来,故而它只是一维数组.一维数组用来表示简单的数列尚可,要是表达复杂的平面坐标系,那就力不从心了.由于平面坐标系存在水平和垂直两个方向,因此可 ...
- 轻松理解 Java HashMap 和 ConcurrentHashMap
前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据. 本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 ...
- jQuery 父iframe与子iframe 相互调用传值
来自:https://blog.csdn.net/wd4871/article/details/50517597 侵删 父页面中的iframe :如下 <iframe name="su ...
- CSS-蜂窝状展示区域(多个六边形)的一种实现方式
网上已经有很多关于正六边形的CSS画法,主要是利用一个矩形和前后的两个三角形组合而成. 之前在看四维图新的官网的时候,发现了一种六边形的画法,比较适合多排六边形组合成蜂窝状的展示区域(注:四维图新现在 ...
- thymeleaf的配置
1.在springboto项目中使用thymeleaf标签,必须先添加依赖,如下. <dependency> <groupId>org.springframework.boot ...
- centos7个人shell编写环境
一.配置存放文件/root/wang 存放常用的文件/root/wang/shell 存放练习的shell文件/root/wang/succeed_shell 存放有用shell文件/root/bak ...
- python浅拷贝和深拷贝
博文参考地址:https://blog.csdn.net/qq_20084101/article/details/82925067 最近在撸码的时候发现了一个严重的问题: a = [1,2] c = ...
- MySQL常用数值函数
数值函数: 用来处理很多数值方面的运算,使用数值函数,可以免去很多繁杂的判断求值的过程,能够大大提高用户的工作效率. 1.ABS(x):返回 x 的绝对值 mysql> select abs(- ...