【Entity Framework】如何理解EF中的級聯刪除

【Entity Framework】如何理解EF中的級聯刪除

文章目錄

  • 【Entity Framework】如何理解EF中的級聯刪除
    • 一、概述
    • 二、發生級聯行為時
      • 2.1/刪除主體/父實體
      • 2.2/斷開關系
    • 三、發生級聯行為的位置
      • 3.1/級聯刪除被跟蹤實體
      • 3.2/數據庫中的級聯刪除
    • 四、級聯NULL

一、概述

Entity Framework Core(EF Core)表示使用外鍵的關系。具有外鍵的實體是關系中的子實體或依賴實體。此實體的外鍵值必須與相關主體/父實體的主鍵值(或替換鍵值)匹配。

如果刪除主體/父實體,則依賴項/子項的外鍵值將不再匹配任何主體/父實體的主鍵或替換鍵。 這是無效狀態,將導致在大多數數據庫中出現引用約束沖突。

可通過兩種方法來避免此引用約束沖突:

  1. 將外鍵值設置為 null。
  2. 同時刪除依賴實體/子實體

第一個選項僅適用于其中外鍵屬性(及其映射到的數據庫列)必須可為null的可選關系。

第二個選項適用于任何類型的關系,它被稱作"級聯刪除"。

二、發生級聯行為時

當依賴實體/子實體無法再與其當前主體/父實體關聯時,需要執行級聯刪除。發生這種情況的原因可能是主體/父實體已被刪除。或者當主體/父實體仍存在,但依賴實體/子實體在再與其關聯時。

2.1/刪除主體/父實體

本文中使用的實體類

public class Blog
{public int Id{get;set;}public string NameP{get;set;}public IList<Post> Posts{get;}=new List<Post>();
}
public class Post
{public int Id { get; set; }public string Title { get; set; }public string Content { get; set; }public int BlogId { get; set; }public Blog Blog { get; set; }
}

其中Blog是與Post(依賴實體/子實體)的關系中的主體/父實體。Post.BlogId是一個外鍵屬性,其值必須與該文章所屬博客中的Blog.Id主鍵匹配。

按照約定,由于Post.BlogId外鍵屬性是不可為null的,因此該關系被配置為必需的。默認情況下,所需的關系配置為使用級聯刪除。

刪除博客時,所有文章都將被級聯刪除。

using var context = new BlogsContext();
var blog = context.Blogs.OrderBy(e=>.Name).Include(e => e.Posts).First();
context.Remove(blog);
context.SaveChanges();

SaveChanges 以 SQL Server 為例,生成以下 SQL:

CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Posts]
WHERE [Id] = @p0;SELECT @@ROWCOUNT;
CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Posts]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Blogs]
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;

2.2/斷開關系

如果不刪除博客,而是斷開每篇文章與其博客之間的關系。為此,可將每篇文章的引用導航Post.Blog設置為null:

using var context= new BlogsContext();
var blog = context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).First();
foreach(var post in blog.Posts)
{post.Blog = null;
}
context.SaveChanges();

還可通過從 Blog.Posts 集合導航中刪除每篇文章內容來斷開關系:

using var context = new BlogsContext();
var blog = context.Blogs.OrderBy(e => e.Name).Include(e.Posts).First();
blog.Posts.Clear();
context.SaveChanges();

無論哪種情況,結果都一樣:沒有刪除博客,但是刪除了不再與任何博客關聯的文章:

SET NOCOUNT ON;
DELETE FROM [Posts]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;SET NOCOUNT ON;
DELETE FROM [Posts]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;

刪除不再與任何主體/依賴實體關聯的實體這一行為被稱作“刪除孤立項”。

級聯刪除和刪除孤立項時密切相關的。當斷開與所需的主體/父實體之間的關系時,兩者都將導致刪除依賴實體/子實體。對于級聯刪除,由于主體/父實體本身已刪除,因此發生了這種斷開。對于孤立項,主體/父實體仍然存在,但不再與依賴實體/子實體相關。

三、發生級聯行為的位置

可將級聯行為應用于:

  • 當前DbContext跟蹤的實體
  • 數據庫中尚未加載到上下文中的實體

3.1/級聯刪除被跟蹤實體

EF Core 始終將配置的級聯行為應用于跟蹤的實體。 這意味著如上面的示例所示,如果應用程序將所有相關的依賴實體/子實體加載到 DbContext 中,則無論如何配置數據庫,都將正確應用級聯行為。

3.2/數據庫中的級聯刪除

許多數據庫系統還提供在數據庫中刪除實體時觸發的級聯行為。使用EnsureCreated或EF Core遷移創建數據庫時,EF Core會根據EF Core模型中的級聯刪除行為來配置這些行為。

CREATE TABLE [Posts] ([Id] int NOT NULL IDENTITY,[Title] nvarchar(max) NULL,[Content] nvarchar(max) NULL,[BlogId] int NOT NULL,CONSTRAINT [PK_Posts] PRIMARY KEY ([Id]),CONSTRAINT [FK_Posts_Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blogs] ([Id]) ON DELETE CASCADE
);

請注意,定義博客和文章之間關系的外鍵約束是用 ON DELETE CASCADE 配置的。

如果我們知道數據庫是這樣配置的,那么我們可以刪除博客,而無需先加載文章,數據庫將負責刪除與此博客相關的所有文章。 例如:

using var context = new BlogsContext();
var blog = context.Blogs.OrderBy(e => e.Name).First();
context.Remove(blog);
context.SaveChanges();

四、級聯NULL

可選關系將可為 null 的外鍵屬性映射到可為 null 的數據庫列。 這意味著當刪除當前主體/父實體或斷開與依賴實體/子實體的關系時,可將外鍵值設置為 NULL。

讓我們再看一下發生級聯行為時的示例,但這次可選關系由可為null的Post.BlogId外鍵屬性表示:

public int? BlogId { get; set; }

刪除每篇文章的相關博客時,該文章的外鍵屬性將設置為 NULL。 例如,此代碼與之前的代碼相同:

using var context = new BlogsContext();
var blog = context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).First();
context.Remove(blog);
context.SaveChanges();

當刪除可選關系中的主體/父實體時,數據庫也可配置為級聯 NULL。 但是,與在數據庫中使用級聯刪除相比,這種情況要少得多。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13734.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13734.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13734.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue3 路由跳轉 攜帶參數

實現功能&#xff1a;頁面A 跳轉到 頁面B&#xff0c;攜帶參數 路由router.ts import { createRouter, createWebHistory } from "vue-router";const routes: RouteRecordRaw[] [{path: "/demo/a",name: "aa",component: () > import(&quo…

x264 碼率控制原理:x264_ratecontrol_start 函數

x264_ratecontrol_start 函數 函數原理 函數功能:編碼一幀之前,為當前幀選擇一個量化 QP,屬于幀級別碼率控制;這對于控制視頻質量和文件大小至關重要。通過調整QP,編碼器可以在保持視頻質量的同時,盡可能減小輸出文件的大小。函數參數:x264_t *h: 編碼器上下文結構體指…

十七、個人信息出境標準合同的具體內容有哪些?

根據《標準合同辦法》第六條&#xff0c;標準合同應當嚴格按照網信辦制定版本訂立&#xff0c;個人信息處理者可以與境外接收方約定其他條款&#xff0c;但不得與標準合同相沖突。 根據《標準合同辦法》附件&#xff0c;目前版本的標準合同內容主要包括&#xff1a; 1. 個人信…

Flutter 中的 TextButton 小部件:全面指南

Flutter 中的 TextButton 小部件&#xff1a;全面指南 在Flutter的世界里&#xff0c;TextButton是一個基礎的小部件&#xff0c;用于創建只包含文本的按鈕。它通常用于對話框、表單以及需要強調主要操作的界面。本文將為您提供一個全面的指南&#xff0c;幫助您了解如何使用T…

地信遙感測繪電子書

《地理信息系統概論》&#xff0c;黃杏元&#xff0c;馬勁松編著&#xff0c;第三版&#xff0c;高等教育出版社&#xff0c;2008年 《地理信息系統》&#xff08;第二版&#xff09;湯國安&#xff0c;趙牡丹&#xff0c;楊昕等編&#xff0c;高等教育出版社&#xff0c;2010…

【stm32/CubeMX、HAL庫】嵌入式實驗五:定時器(2)|PWM輸出

參考&#xff1a; 【【正點原子】手把手教你學STM32CubeIDE開發】 https://www.bilibili.com/video/BV1Wp42127Cx/?p13&share_sourcecopy_web&vd_source9332b8fc5ea8d349a54c3989f6189fd3 《嵌入式系統基礎與實踐》劉黎明等編著&#xff0c;第九章定時器&#xff0c…

8操作系統定義、分類及功能+設備管理+作業管理 軟設刷題 軟考+

操作系統定義、分類及功能設備管理作業管理 知識點1-55-1010-1515-2020-2525-3030-35 刷題操作系統定義、分類及功能1-55-1010-15作業管理1-5設備管理1-55-10 知識點 1-5 1 嵌入式操作系統的特點&#xff1a; 1.微型化&#xff0c;從性能和成本角度考慮&#xff0c;希望占用的…

145.棧和隊列:刪除字符串中的所有相鄰重復項(力扣)

題目描述 代碼解決 class Solution { public:string removeDuplicates(string s) {// 定義一個棧來存儲字符stack<char> st;// 遍歷字符串中的每一個字符for(int i 0; i < s.size(); i){// 如果棧為空或棧頂字符與當前字符不相同&#xff0c;則將當前字符入棧if(st.e…

Jenkins的Pipeline流水線

目錄 前言 流水線概念 什么是流水線 Jenkins流水線 pipeline node stage step 創建一個簡單的流水線 創建Pipeline項目 選擇模板 測試 前言 提到 CI 工具&#xff0c;首先想到的就是“CI 界”的大佬——Jenkjns,雖然在云原生爆發的年代,蹦出來了很多云原生的 CI 工具…

Hive的窗口函數

定義&#xff1a; 聚合函數是針對定義的行集(組)執行聚集,每組只返回一個值.如sum()、avg()、max() 窗口函數也是針對定義的行集(組)執行聚集,可為每組返回多個值.如既要顯示聚集前的數據,又要顯示聚集后的數據.步驟&#xff1a; 1.將記錄分割成多個分區. 2.在各個分區上調用窗…

word-表格疑難雜癥診治

一、用表格進行排版圖片、制作公文頭 可以在插入圖片時固定列寬 二、表格中的疑難雜癥 問題一&#xff1a;表格超過頁面&#xff0c;右側文字看不見 解決&#xff1a;表格窗口-布局-自動調整-根據窗口自動調整表格 問題二&#xff1a;表格底部文字被遮擋 解決&#xff1a;布…

ArcGIS Maps SDK for JS:使用queryFeatures方法查詢 FeatureLayer 中符合條件的要素

文章目錄 方式一&#xff1a;使用featureLayer.createQuery()方法方式二&#xff1a;使用 Query 構造函數方式三&#xff1a;簡化寫法 要想查詢FeatureLayer 圖層中滿足某些條件的要素&#xff0c;可以使用ArcGIS API for JavaScript 提供的queryFeatures() 方法和 Query 對象進…

【linux】yumvim工具理解使用

目錄 Linux 軟件包管理器 yum 關于 rzsz 注意事項 查看軟件包 Linux開發工具 Linux編輯器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 vim末行模式命令集 簡單vim配置 配置文件的位置 sudo提權 Linux 軟件包管理器 yum 1.yum是什么&#xff1…

攻防世界---web---warmup

1、題目描述 2、查看源碼&#xff0c;發現有個source.php 3、訪問該文件&#xff0c;得到這一串代碼 4、分析代碼 5、訪問hint.php&#xff0c;提示flag在ffffllllaaaagggg這個文件下 6、構造payload ?filesource.php?/../../../../../../ffffllllaaaagggg

Fitting Parameterized Three-Dimensional Models to Images

摘要 基于模型的識別和運動跟蹤依賴于解決投影和模型參數&#xff0c;使其最佳適應匹配的2D圖像特征的3D模型的能力。本文將當前的參數求解方法擴展到處理具有任意曲面和任意數量的內部參數&#xff08;表示關節、可變尺寸或表面變形&#xff09;的對象。開發了數值穩定化方法…

懶人網址導航頁 search.html SQL注入漏洞復現

0x01 產品簡介 懶人網址導航系統是一種智能化的網址導航平臺,旨在幫助用戶快速找到所需的網址和資源。該系統提供了智能化的網址搜索和推薦功能,能夠根據用戶的搜索習慣和偏好推薦相關的網址和資源。同時,系統還提供了網址分類、網址收藏和網址分享等功能,方便用戶管理和共…

git常見的18條指令

使用git的時候有沒有遺忘指令的情況呢&#xff1f;小編替大家整理出來了18條常用的指令&#xff0c;大家趕緊收藏起來吧&#xff01; gti常見的18條指令 序號指令含義1git init初始化一個倉庫2git clone [url]克隆一個倉庫3git add [file]添加文件到暫存區4git commit -m "…

簡易Docker磁盤使用面板Doku

這個項目似乎有 1 年多沒更新了&#xff0c;最后發布版本的問題也沒人修復&#xff0c;所以看看就行&#xff0c;不建議安裝 什么是 Doku &#xff1f; Doku 是一個簡單、輕量級的基于 Web 的應用程序&#xff0c;允許您以用戶友好的方式監控 Docker 磁盤使用情況。Doku 顯示 D…

easyexcel導出動態標題,以及動態設置下拉選擇,并設置下拉選擇校驗

目錄 1.說明 2.示例 3.總結 1.說明 平時使用easyexcel進行導出時&#xff0c;標題的名字通過在表的實體類上添加注解的方式進行實現&#xff0c;然后傳入表的實體類的集合進行下載即可。 有這么一個需求&#xff0c;用戶可以自定義導出的模板&#xff0c;也就是說導出的模板…

南京沁恒微USB HUB CH334/CH335多種封裝規格選擇,外圍簡單,價格還美麗

概述&#xff1a; CH334 和 CH335 是符合 USB2.0 協議規范的 全速&#xff0c;下行端口支持 USB2.0 高速 480Mbps 個 TT 分時調度 4 個下行端口&#xff09;&#xff0c;還支持高性能的 工業級設計&#xff0c;外圍精簡&#xff0c;可應用于計算機和工控機主板 特點&#xff1…