看看這段代碼:
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),沒有拋出例外,并且博客從資料庫中洗掉......
編輯 :
我會更明確:
我故意將洗掉行為從 更改onDelete: ReferentialAction.Cascade為onDelete: ReferentialAction.Restrict,這就是為什么如果我嘗試使用 sql 命令洗掉博客時會出現外鍵例外。
另一件事,我洗掉了所有博客以使事情變得簡單,但是在資料庫中我只添加了一個博客,指定 id 不會改變任何東西。
uj5u.com熱心網友回復:
閱讀https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.deletebehavior?view=efcore-5.0
當您洗掉父物體時,您可以通過多種方式告訴 EF 行為。如果您在洗掉父項時沒有看到資料庫拋出錯誤,則 EF 正在后臺進行一些修復 - 要么成功洗掉它首先知道的所有子項,要么通過設定外鍵列來破壞關系在洗掉父級之前,首先將子級設定為空(孤立)
如果您從未專門設定任何行為,那么 EF 正在做什么將取決于 Post.BlogId 是否可以為空。如果不是,那么帖子將被洗掉。如果是,那么它們將被設定為具有空的 BlogId。
如果您UseSqlServer在啟動配置中找到呼叫并將呼叫之類的東西鏈接.LogTo(Console.WriteLine, LogLevel.Information)到它,則可以顯示正在執行的 SQL(始終是一個方便的除錯工具)
uj5u.com熱心網友回復:
您必須將 Id 添加到您的 sql 腳本中。就像現在一樣,您正在洗掉所有博客,而不僅僅是一個新博客。但是有些帖子可以有來自其他帖子的 BlogId 并且您不能在將外鍵分配給 null 之前洗掉它們,或者如果之前無法洗掉所有帖子。
db.Database.ExecuteSqlRaw("Delete from Blogs where BlogId=" blog.BlogId.ToString());
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/414965.html
標籤:
