1

Я работаю над проектом, и я пытаюсь получить каскадное удаление для ввода. У меня есть модель ниже, которую я использую для комментариев. Эти комментарии могут содержать ответы, которые вызывают класс комментариев. Я пытаюсь сделать это, чтобы удалить все ответы, которые могут вытекать из комментария.Каскад Удалить Entity внутри объекта

Комментарий -> Ответить -> Ответить -> так.

Если я собираюсь сделать это в неправильном направлении, пожалуйста, дайте мне знать. Я попытался исследовать это, но все, что я придумал, - это каскадные коды «один на один» и «один-много». Я использую CodeFirst с MVC 4 для создания моего проекта.

Edited

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); 

Ho Веверу, он не будет делать вам много хорошего, - как Update-Database удастся что-то вроде ...

внешнего ключа ограничение, которое имеет UPDATE или DELETE CASCADE правило, и самостоятельной ссылки на столбец в та же таблица не допускается.

то, что работает на FK-х, которые подключаются различные таблицы - но если self-referencing.

Посмотреть этот пост с некоторыми более актуальной информации - особенно комментарий, который упоминает

«вам нужно сбросить FK и создать его вручную с каскадом удалить в свой DatabaseInitializer»

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

Короче говоря, я не думаю, что есть прямое решение - но требуется ручная настройка (инициализатор и т. Д.) (Я не пробовал). Или попробуйте реорганизовать, немного сгладить отношения (я не очень много думал, просто бросая сюда некоторые довольно общие подходы).


Просто FYI - хотя я думаю, что это не будет вам в любом месте (смотри выше) ...

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

Я думаю, что у меня его почти нет. Я получаю a \ tSystem.Data.Entity.Edm.EdmAssociationType:: Многократность конфликтует с реляционным ограничением в роли «Comment_Replies_Source» в отношении «Comment_Replies». Поскольку все свойства в зависимой роли не имеют значения NULL, множественность главной роли должна быть «1». error –

+0

Я думаю, вы можете удалить «Обратный», так как он должен правильно его получить (и + Обязательно).Но это все еще «бесполезная» попытка - если вы не реорганизовали ее (я могу редактировать код, который работает до этой ошибки). – NSGaga

+0

Я все еще получаю ту же ошибку. Я думаю, что это может быть связано с тем, что ответы являются объектами с нулевым значением. Поскольку это необязательное поле, это может быть неудачным в этой части. Я не уверен. –

Смежные вопросы