1

我一直在做一個項目,我試圖讓級聯刪除踢。我有一個模型下面我使用評論。這些評論可以有回覆,他們稱爲評論類。我想要做的就是刪除所有可以從評論中流出的回覆。級聯刪除實體內的實體

評論 - >回覆 - >回覆 - >回覆 - >等等。

如果我以錯誤的方向去解決這個問題,請告訴我。我試圖研究這一點,但我所提出的是一對一和一對多的級聯代碼。我使用CodeFirst與MVC 4來構建我的項目。

編輯

public class Comment 
    { 
     // Properties 
     public long Id { get; set; } 

     [Required] 
     [StringLength(250, ErrorMessage = "{0} must be between {1} and {2} characters", MinimumLength = 2)] 
     public string Body { get; set; } 

     [Required] 
     public DateTime CreateDate { get; set; } 

     [Required] 
     [InverseProperty("Comments")] 
     public User Author { get; set; } 

     [InverseProperty("CommentCount")] 
     public Blog Blog { get; set; } 

     public bool Hidden { get; set; } 

     public long RepliesId { get; set; } 

     [InverseProperty("Replies")] 
     public virtual Comment Comments { get; set; } 

     [InverseProperty("Comments")] 
     public virtual ICollection<Comment> Replies { get; set; } 

     public virtual ICollection<Vote> Votes { get; set; } 

     public Comment() 
     { 
      CreateDate = DateTime.UtcNow; 
      Hidden = false; 
     } 
    } 

這裏是我的DataContextInitializer

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Comment>().HasMany(i => i.Replies) 
      .WithOptional(i => i.Comments) 
      .HasForeignKey(i => i.RepliesId) 
      .WillCascadeOnDelete(); 
    } 

回答

2

你可以使級聯像這樣的東西刪除(即你需要手動設置的關係)......

modelBuilder.Entity<Comment>() 
    .HasOptional(x => x.Replies) 
    .WithOptionalDependent() 
    .WillCascadeOnDelete(true); 

何wever,它不會做你多好 - 因爲Update-Database將失敗,並像...

一個具有UPDATE或DELETE CASCADE規則, 和自我引用一列外鍵約束同一張表是不允許的。

即上即連接不同的表FK-作品 - 但如果self-referencing

見一些更相關的信息這篇文章 - 尤其是提到

「你需要刪除的FK和手動級聯創建刪除 你DatabaseInitializer」

EF4 Code first - delete all children when deleting parent from db?評論

總之,我不認爲有一個直接的解決方案 - 但一些手動設置(初始化等)是必需的(我還沒有嘗試過)。或者嘗試重組,平坦化關係(我沒有多想,只是在這裏拋出一些非常普遍的方法)。


僅供參考 - 儘管我認爲它不會讓你在任何地方(見上文)...

public class Comment 
{ 
    // Properties 
    public long Id { get; set; } 

    //[Required] 
    //[StringLength(250, ErrorMessage = "{0} must be between {1} and {2} characters", MinimumLength = 2)] 
    public string Body { get; set; } 

    [Required] 
    public DateTime CreateDate { get; set; } 

    // [Required] 
    // [InverseProperty("Comments")] 
    public MyUser Author { get; set; } 

    // [InverseProperty("CommentCount")] 
    public Blog Blog { get; set; } 

    public bool Hidden { get; set; } 

    public virtual ICollection<Comment> Replies { get; set; } 
    public virtual ICollection<Vote> Votes { get; set; } 

    public Comment() 
    { 
     CreateDate = DateTime.UtcNow; 
     Hidden = false; 
    } 
} 

modelBuilder.Entity<Comment>() 
    .HasOptional(x => x.Replies) 
    .WithOptionalDependent() 
    .WillCascadeOnDelete(true); 

這應該正常工作,如果你讓它「不級聯」。否則失敗。

+0

我想我差不多有它。我得到\ tSystem.Data.Entity.Edm.EdmAssociationType::多重性與'Comment_Replies'關係中'Comment_Replies_Source'角色中的參照約束髮生衝突。由於從屬角色中的所有屬性都是不可空的,所以主體角色的多重性必須爲'1'。錯誤 –

+0

我認爲你可以刪除'反向',因爲它應該是正確的沒有它(和+必需)。但它仍然是'徒勞'的嘗試 - 除非你重新組織它(我可以編寫代碼來解決這個錯誤)。 – NSGaga

+0

我仍然收到相同的錯誤。我認爲這可能是由於答覆是一個可空的實體。由於它是一個可選字段,因此可能在該部分失敗。我不確定。 –