在 DbContext 或DbSet 上使用Remove 方法
已經跟蹤對象刪除:
var blog = context.Blogs.Find(1); Console.WriteLine(context.Entry(blog).State); context.Blogs.Remove(blog); Console.WriteLine(context.Entry(blog).State); context.SaveChanges(); Console.WriteLine(context.Entry(blog).State);
未跟蹤對象刪除:
var blog = new Blog { BlogId = 4 }; Console.WriteLine(context.Entry(blog).State); context.Remove(blog); Console.WriteLine(context.Entry(blog).State); context.SaveChanges(); Console.WriteLine(context.Entry(blog).State);
顯式設置 EntityState 狀態
已跟蹤對象狀態標記刪除:
var blog = context.Blogs.Find(2); Console.WriteLine(context.Entry(blog).State); context.Entry(blog).State = EntityState.Deleted; Console.WriteLine(context.Entry(blog).State); context.SaveChanges(); Console.WriteLine(context.Entry(blog).State);
未跟蹤游離狀態的刪除(有主鍵即可):
var blog = new Blog { BlogId = 3 }; Console.WriteLine(context.Entry(blog).State); context.Entry(blog).State = EntityState.Deleted; Console.WriteLine(context.Entry(blog).State); context.SaveChanges(); Console.WriteLine(context.Entry(blog).State);
批量刪除數據
void RemoveRange([NotNullAttribute] IEnumerable<object> entities); void RemoveRange([NotNullAttribute] params object[] entities);
使用存儲過程或者原生SQL刪除數據
_context.Database.ExecuteSqlCommand("SQL");
級聯刪除
級聯刪除是數據庫的常用術語,允許在刪除某行時自動觸發刪除相關行的特性,這通常稱為:刪除孤立項。EF Core 默認根據必需和可選約定判定刪除行為,也可顯式指定不同的刪除行為。
必需和可選的關系(默認)
modelBuilder.Entity<Post>() .HasOne(p => p.Blog) .WithMany(b => b.Posts) .IsRequired();
顯式指定級聯關系
modelBuilder.Entity<Post>() .HasOne(p => p.Blog) .WithMany(b => b.Posts) .OnDelete(DeleteBehavior.Cascade);
刪除父實體時可以執行三種操作
- 可以刪除子項/依賴項
- 子項的外鍵值可以設置為 null
- 子項保持不變
第1種就是級聯刪除,即刪除父項時自動刪除相關的子項。
第2種是刪除父項時,將子項對應的外鍵值設置為null,如果該字段不能為null,則拋出異常。
第3種就是約束了,因為刪除父項而子項保持不變,這是違反數據庫約束的,如果父項已經被引用,直接拋出異常。
對內存實體和數據庫的影響對比
可選關系:對於可選關系(可以為 null 的外鍵),可以保存 null 外鍵值。
行為名稱 |
對內存中的依賴項/子項的影響 |
對數據庫中的依賴項/子項的影響 |
Cascade |
刪除實體 |
刪除實體 |
ClientSetNull(默認) |
外鍵屬性設置為 null |
無 |
SetNull |
外鍵屬性設置為 null |
外鍵屬性設置為 null |
Restrict |
無 |
無 |
必選關系:對於必選關系(不可為 null 的外鍵),不可以保存 null 外鍵值。
行為名稱 |
對內存中的依賴項/子項的影響 |
對數據庫中的依賴項/子項的影響 |
Cascade(默認) |
刪除實體 |
刪除實體 |
ClientSetNull |
SaveChanges 引發異常 |
無 |
SetNull |
SaveChanges 引發異常 |
SaveChanges 引發異常 |
Restrict |
無 |
無 |