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.

좀 더 관련 정보와 함께 해당 게시물을 참조 -

EF4 Code first - delete all children when deleting parent from db? "당신이 에서 삭제하여 DatabaseInitializer을 FK를 삭제하고 수동으로 캐스케이드를 만들 필요"언급 특히 주석을 간단히 말해, 나는 솔직한 해결책이 있다고 생각하지 않는다. 그러나 수동 설정 (초기화 도구 등)이 필요하다. (나는 그것을 시도하지 않았다). 또는 재구성을 시도하고, 관계를 약간 평평하게하십시오 (나는 많이 생각하지 않았습니다. 단지 꽤 일반적인 접근법을 여기에 던집니다).


참고하시기 바랍니다 - 나는 (위 참조) 어디서나 당신을 얻을하지 않을 생각에도 불구하고

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'역할의 참조 제약 조건과 충돌합니다. 종속 역할의 모든 속성은 nullable이 아니므로 Principal 역할의 다양성은 '1'이어야합니다. 오류 –

+0

나는 그것을 (또는 + 필요) 승/O를 그것을해야 얻을 수있는 '반전'제거 할 수있을 것 같아요.그러나 당신이 그것을 재구성하지 않는다면 (나는 그 오류까지 작동하는 코드에서 편집 할 수 있습니다) 여전히 '쓸데없는'시도입니다. – NSGaga

+0

여전히 같은 오류가 발생합니다. 나는 그것이 nullable 엔티티 인 응답으로 인한 것 같아요. 옵션 필드가 있기 때문에 해당 부분에서 실패 할 수 있습니다. 나는 잘 모르겠다. –