我正在使用Entity Framework开发一个ASP.NET MVC项目我正在使用代码优先方法。我在使用自引用外键删除实体时遇到问题,并且它是使用递归函数的相关实体。
我正在使用递归函数删除,因为无法在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);
}
}
}
我正在删除此结构中的数据
我正在删除test1。但是当递归函数本身被调用时,它只是一直使用test2传递List。我该如何修复我的代码?如何使用递归函数删除类别及其相关类别?
我试过这个来阻止递归。它只是不能停止,只是一样。
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 :(得分:3)
我发现了错误。递归是我的错。我在递归函数中使用了while循环。所以它变成了无限循环。 Actualy我需要使用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);
}
}
}