![](/img/trans.png)
[英]How Entity Framework 6 decides if the FK should be defined with ON DELETE CASCADE
[英]Entity framework FK not updating on cascade delete
我當前正在使用Entity Framework 5,這是一個相當簡單的問題。 我有兩種以收件人為參考的類型。
public File() : base()
{
this.Preview = FilePreview.None;
this.Recipients = new HashSet<SharedFileRecipient>();
}
public Folder() : base()
{
this.Preview = FilePreview.None;
this.Recipients = new HashSet<SharedFileRecipient>();
}
SharedFileRecipient只是具有一些屬性的常規C#類,並且不指定對File或Folder的引用。
在數據庫中,EF映射了所有這些細節,包括將兩個可為空的FK(File_Id和Folder_Id)添加到dbo.SharedFileRecipients表中,該表指向dbo.File或dbo.Folder。
到目前為止,一切都很好,但是在運行時,當我們嘗試刪除已共享的文件或文件夾時,數據庫將引發錯誤
“ DELETE語句與REFERENCE約束\\“ FK_dbo.SharedFileRecipient_dbo.Folder_Folder_Id \\”沖突。
我知道這是因為EF沒有在dbo.SharedFileRecipients上運行更新,因此在繼續刪除父對象之前,File_Id和Folder_Id列為空。
我們如何告訴EF這需要發生? 而且,如果我實際上想強制對文件/文件夾進行級聯刪除,以使SharedFileRecipients在刪除時消失,那么如何告訴EF?
我已經閱讀了很多有關使用Fluent API進行設置的文章,但是我認為這不適用於我的非常簡單的模型。 就像我必須(明確地)在SharedFileRecipient上聲明外鍵屬性一樣。
您必須從數據庫中加載相關的Recipients
。 無論您是急切的,懶惰的還是顯式的加載,都沒關系。 一旦加載了子代並將其附加到上下文,EF將向數據庫發送UPDATE語句,以在刪除父代時將子代的外鍵設置為NULL。 例如,渴望加載:
var file = context.Files.Include(f => f.Recipients).Single(f => f.Id == someId);
context.Files.Remove(file);
沒有任何配置可以自動實現。 關鍵是將相關的子代附加到上下文。
如果要為(可選)關系設置級聯刪除,可以將此配置與Fluent API結合使用:
modelBuilder.Entity<File>()
.HasMany(f => f.Recipients)
.WithOptional()
.WillCascadeOnDelete(true);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.