2015-08-03 111 views
1

我需要對刪除級聯進行徹底解釋,因爲它給了我不必要的頭痛。我有一個News.cs類和一個Comment.cs類。新聞有評論的收集和評論必須屬於某個新聞,所以我成立了我的課像下面關於在實體框架中刪除級聯的說明

public class News 
{ 
    public int NewsId { get; set; } 

    [Display(Name = "Title")] 
    public string Title { get; set; } 

    [Display(Name = "Details")] 
    public string Details { get; set; } 

    public DateTime DateCreated { get; set; } 

    public int AppUserId { get; set; } 

    [ForeignKey("AppUserId")] 
    public virtual AppUser AppUser { get; set; } 

    public ICollection<Comment> Comment { get; set; } 

} 

public class Comment 
{ 
    public int CommentId { get; set; } 

    public string CommentText { get; set; } 

    public DateTime DateCreated { get; set; } 

    public int AppUserId { get; set; } 

    public int NewsId { get; set; } 

    [ForeignKey("AppUserId")] 
    public virtual AppUser User { get; set; } 

    [ForeignKey("NewsId")] 
    public virtual News News { get; set; } 

} 

我期待的行爲是,如果我刪除一條評論,應該不會影響到父新聞,但如果我刪除一條消息,我沒有看到任何理由保留孩子的意見,所以意見應該刪除。 我跑在包管理器控制檯更新數據庫命令我不停收到此錯誤

引進國外KEY約束「FK_dbo.Comments_dbo.News_NewsId」表「評論」 可能會導致循環或多個級聯路徑。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他的FOREIGN KEY約束。無法創建約束。請參閱前面的 錯誤。 我該如何解決這個問題?

+3

由於新聞的鏈接評論和評論新聞你會得到一個「迴路」時刪除。您需要在註釋中指定ON DELETE NO ACTION選項。因此,當您刪除新聞時,評論將被刪除,但是沒有任何操作可以回到新聞鏈接(阻止循環)。 – JustFogMaxi

+0

您可以使用Fluent API刪除級聯刪除,如此處所述:http://stackoverflow.com/questions/17127351/introducing-foreign-key-constraint-may-cause-cycles-or-multiple-cascade-paths –

+0

@JustFogMaxi否,雙向關係只是一個類模型工件。在數據庫中,它是一個和相同的外鍵,具有定義的一個*級聯刪除操作(從父到子)。這必須由其他具有級聯刪除的外鍵引起,我懷疑是'Comment.AppUser'。 –

回答

1

此錯誤是由於刪除一個實體而導致的,另一個實體會被刪除多一次。

在您的場景中,如果您刪除啓用級聯刪除的AppUser,則會嘗試刪除相關實體,新聞和評論。由於評論也依賴於新聞,當新聞被刪除時,評論將作爲依賴(再次)被刪除。因爲它可能已經被刪除了,因爲依賴於AppUser,所以SQL不能保證該實體現在存在,所以SQL Server將阻止你首先實現這一點。

要解決,最簡單的事情就是關閉級聯的一個或通過流暢API更家屬的刪除:

modelBuilder.Entity<AppUser>().HasMany(au => au.Comments) 
.WithRequired(c => c.AppUser) 
.HasForeignKey(c => c.AppUserID) 
.WillCascadeOnDelete(false); 

modelBuilder.Entity<AppUser>().HasMany(au => au.News) 
.WithRequired(n => n.AppUser) 
.HasForeignKey(n => n.AppUserID) 
.WillCascadeOnDelete(false); 
+0

我試過這個,我能夠運行更新數據庫,但在進入應用程序時,我試圖刪除一個新聞項目,我得到這個錯誤DELETE語句與參考約束「FK_dbo.Comments_dbo.News_NewsId」衝突。衝突發生在數據庫「Intranet」,表「dbo.Comments」,列'NewsId'。 該聲明已被終止。 – ibnhamza

+0

因此,使FK級聯而不是其他。 –

相關問題