C# c语言中的递归删除#

C# c语言中的递归删除#,c#,recursion,C#,Recursion,我有一个要删除的父项。看起来是这样的: -Parent - Child 1 -Subchild 1 -Subchild 2 当我删除父项时,我还想删除子项。这是我的代码: public void DeleteMenu(int id) { var item = this.db.Menus.Single(x => x.Id == id); //DELETE FOREIGN KEYS //MenuLanguageSet

我有一个要删除的父项。看起来是这样的:

-Parent
 - Child 1
   -Subchild 1
   -Subchild 2
当我删除父项时,我还想删除子项。这是我的代码:

public void DeleteMenu(int id)
    {
        var item = this.db.Menus.Single(x => x.Id == id);

        //DELETE FOREIGN KEYS
        //MenuLanguageSet
        var languages = from listLanguages in this.db.MenuLanguageSet
                        where listLanguages.idMenu == id
                        select listLanguages;

        foreach (var itemLanguages in languages)
        {
            this.db.MenuLanguageSet.Remove(itemLanguages);
        }

        //Accesses
        var accesses = from listAccesses in this.db.Accesses
                        where listAccesses.menuId == id
                        select listAccesses;



        foreach (var itemAccesses in accesses)
        {
            this.db.Accesses.Remove(itemAccesses);    
        }

        //DELETE CHILD
        //Menus
        var menusChild = from listmenus in this.db.Menus
                        where listmenus.parentId == id
                        select listmenus;

        foreach (var child in menusChild)
        {
            DeleteMenu(child.Id);
        }


        //delete parent
        this.db.Menus.Remove(item);
        this.db.SaveChanges();


    }
这不起作用,我不知道为什么。我不知道如何做循环。

明白了

这是我的最终代码:

    public void DeleteMenu(int id)
    {
        this.RecursiveDeleteMenu(id);
        this.db.SaveChanges();


    }
    public void RecursiveDeleteMenu(int id)
    {
        var item = this.db.Menus.Single(x => x.Id == id);

        //DELETE FOREIGN KEYS
        //MenuLanguageSet
        var languages = from listLanguages in this.db.MenuLanguageSet
                        where listLanguages.idMenu == id
                        select listLanguages;

        foreach (var itemLanguages in languages)
        {
            this.db.MenuLanguageSet.Remove(itemLanguages);
        }

        //Accesses
        var accesses = from listAccesses in this.db.Accesses
                       where listAccesses.menuId == id
                       select listAccesses;



        foreach (var itemAccesses in accesses)
        {
            this.db.Accesses.Remove(itemAccesses);
        }

        //DELETE CHILD
        //Menus
        var menusChild = from listmenus in this.db.Menus
                         where listmenus.parentId == id
                         select listmenus;

        foreach (var child in menusChild)
        {
            RecursiveDeleteMenu(child.Id);
        }


        //delete parent
        this.db.Menus.Remove(item);
    }
我遇到错误
不允许新事务,因为会话中有其他线程运行
,因为
this.db.SaveChanges()
处于循环中


谢谢大家

定义
这不起作用
此外,数据库中的级联删除的效率应该是菜单项的几倍。级联删除是更好的方法,如果您能够to@austinwernliflq:Cascade delete是最好的解决方案,如果SQL Server(因此是EF)支持自引用表。但事实并非如此(错误可能导致循环或多个级联路径等等:)