簡體   English   中英

實體框架FK在級聯刪除時未更新

[英]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.

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