Я разрабатываю проект 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);
}
}
}
Я удаление данных в этой структуре
Я удаляю тест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);
}
}
}
Обнаружена ошибка, и я отправлю ответ в ближайшее время. –