1

Я разрабатываю проект ASP.NET MVC с использованием Entity Framework. Я использую первый подход кода. У меня возникла проблема с удалением сущности с внешним ключом для самостоятельной привязки и связанными объектами с использованием рекурсивной функции.Удалить объект с саморегуляционным внешним ключом с использованием рекурсивной функции в Entity Framework

Я удаляю использование рекурсивной функции, потому что невозможно установить каскад удаления для самостоятельного указания внешнего ключа в SQL Server. Когда я удаляю, он выдает исключение stackoverflow, если сущность имеет связанные сущности, подлежащие удалению. Потому что рекурсивная функция никогда не перестает звонить. Он становится бесконечным. См. Мой сценарий ниже.

Это моя сущность класс с автореферентным FK

public class Category 
{ 
     public int Id { get; set; } 
     [Required] 
     [MaxLength(50)] 
     public string Name { get; set; } 
     [MaxLength(55)] 
     public string MmName { get; set; } 
     public int? ParentId { get; set; } 

     [ForeignKey("ParentId")] 
     public virtual Category ParentCategory { get; set; } 
     public virtual ICollection<Category> Categories { get; set; } 
     public virtual ICollection<Item> Items { get; set; } 
} 

Это, как я удаление в модели с использованием рекурсивной функции:

public List<int> deletedIds = new List<int>(); 

     public Category Delete(Category category) 
     { 
      if(category!=null) 
      { 
       int intentionId = category.Id; 
       if(category.Categories!=null && category.Categories.Count>0) 
       { 
        RelatedCategories(category.Categories); 
       } 
       deletedIds.Add(intentionId); 
       if(deletedIds.Count>0) 
       { 
        IEnumerable<Category> categories = context.Categories.Where(x => deletedIds.Contains(x.Id)); 
        if(categories!=null && categories.Count()>0) 
        { 
         context.Categories.RemoveRange(categories); 
         context.SaveChanges(); 
        } 
       } 
      } 
      return category; 
     } 

     private void RelatedCategories(IEnumerable<Category> categories) 
     { 
      foreach(var c in categories) 
      { 
       deletedIds.Add(c.Id); 
       while (c.Categories!=null && c.Categories.Count > 0) 
       { 
        RelatedCategories(c.Categories); 
       } 
      }   
     } 

Я удаление данных в этой структуре

enter image description here

Я удаляю тест1. Но когда рекурсивная функция вызывается сама по себе, она просто продолжает передавать List с test2 все время. Как я могу исправить свой код? Как удалить категорию и связанные с ней категории с помощью рекурсивной функции?

Я попытался остановить рекурсию. Он просто не может остановиться и точно так же.

private void RelatedCategories(IEnumerable<Category> categories) 
     { 
      Category repeatedCategory = null; 
      if(categories!=null && categories.Count()>0 && deletedIds.Count>0) 
      { 
       repeatedCategory = categories.FirstOrDefault(x => deletedIds.Contains(categories.Select(c => c.Id).FirstOrDefault())); 
      } 
      if(repeatedCategory!=null) 
      { 
       return; 
      } 
      foreach(var c in categories) 
      { 
       deletedIds.Add(c.Id); 
       while (c.Categories!=null && c.Categories.Count > 0) 
       { 
        RelatedCategories(c.Categories); 
       } 
      }   
     } 
+0

Обнаружена ошибка, и я отправлю ответ в ближайшее время. –

ответ

2

Я нашел ошибку. Это была моя ошибка с рекурсивным. Я использовал цикл while в рекурсивной функции. Таким образом, он становится бесконечным циклом. Фактически, мне нужно было использовать инструкцию if. Я просто заменил эту функцию. Он работал нормально.

private void RelatedCategories(IEnumerable<Category> categories) 
     { 
      foreach (var c in categories) 
      { 
       deletedIds.Add(c.Id); 
       if(c.Categories!=null && c.Categories.Any()) 
       { 
        SetRelatedCategories(c.Categories); 
       } 
      } 
     }