簡體   English   中英

為什么實體框架不在這里拋出異常?

[英]Why doesn't Entity Framework throw an exception here?

看看這段代碼:

Blog blog = new Blog { Url = "http://blogs.msdn.com/adonet" };
blog.Posts.Add(
     new Post { Title = "Hello World", Content = "I wrote an app using EF Core!" });

db.Add(blog);
db.SaveChanges();

// db.Database.ExecuteSqlRaw("Delete from Blogs"); --> throw exception for Foreign key
//db.Remove(blog); // --> works and doesn't throw exception

db.SaveChanges();

我不明白為什么在刪除包含帖子的博客時,我們有外鍵異常(這很正常,因為我刪除了級聯選項)。 但是當我做db.Remove(blog)時,沒有拋出異常,並且博客從數據庫中刪除......

您必須將 Id 添加到您的 sql 腳本中。 就像現在一樣,您正在刪除所有博客,而不僅僅是一個新博客。 但是有些帖子可以有來自其他帖子的 BlogId 並且您不能刪除它們,在您為 null 分配外鍵之前,或者如果不可能刪除之前的所有帖子。

db.Database.ExecuteSqlRaw("Delete from Blogs where BlogId="+blog.BlogId.ToString()); 

閱讀https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.deletebehavior?view=efcore-5.0

當您刪除父實體時,您可以通過多種方式告訴 EF 行為。 如果您在刪除父級時沒有看到數據庫拋出錯誤,則 EF 正在后台進行一些修復 - 要么成功刪除它首先知道的所有子級,要么通過設置外鍵列打破關系在刪除父級之前,首先將子級轉換為 null(孤立)

如果您從未專門設置任何行為,那么 EF 正在做什么將取決於 Post.BlogId 是否可以為空。 如果不是,那么帖子將被刪除。 如果是,那么它們將被設置為具有 null BlogId。

如果您在啟動配置中找到UseSqlServer調用並將類似於對.LogTo(Console.WriteLine, LogLevel.Information)的調用鏈接到它,則可以顯示正在執行的 SQL(始終是一個方便的調試工具)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM