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)支持自引用表。但事实并非如此(错误可能导致循环或多个级联路径等等:)