【EFCORE筆記】刪除數據的多種方案


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);

  

刪除父實體時可以執行三種操作

  1. 可以刪除子項/依賴項
  2. 子項的外鍵值可以設置為 null
  3. 子項保持不變

1種就是級聯刪除,即刪除父項時自動刪除相關的子項。

2種是刪除父項時,將子項對應的外鍵值設置為null,如果該字段不能為null,則拋出異常。

3種就是約束了,因為刪除父項而子項保持不變,這是違反數據庫約束的,如果父項已經被引用,直接拋出異常。

 

對內存實體和數據庫的影響對比

可選關系:對於可選關系(可以為 null 的外鍵),可以保存 null 外鍵值。

行為名稱

對內存中的依賴項/子項的影響

對數據庫中的依賴項/子項的影響

Cascade

刪除實體

刪除實體

ClientSetNull(默認)

外鍵屬性設置為 null

SetNull

外鍵屬性設置為 null

外鍵屬性設置為 null

Restrict

必選關系:對於必選關系(不可為 null 的外鍵),不可以保存 null 外鍵值。

行為名稱

對內存中的依賴項/子項的影響

對數據庫中的依賴項/子項的影響

Cascade(默認)

刪除實體

刪除實體

ClientSetNull

SaveChanges 引發異常

SetNull

SaveChanges 引發異常

SaveChanges 引發異常

Restrict


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM