使用实体框架

时间:2016-07-02 07:17:09

标签: asp.net sql-server entity-framework recursion recursive-datastructures

我正在使用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);
                }
            }        
        }

我正在删除此结构中的数据

enter image description here

我正在删除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);
                }
            }        
        }

1 个答案:

答案 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);
                }
            }
        }