2014-01-14 53 views
1

我在SQL數據庫有這個表:刪除對象的所有子與父/子關係

Folders 
----------- 
FolderID 
Name 
ParentFolderID 

我有ParentFolderIDFolderID之間的外鍵關係,使得它創建一個父/子關係。

當我刪除一個文件夾,我想它也刪除所有的子文件夾。我無法將關係設置爲級聯刪除,因爲顯然SQL Server不允許這樣的關係。但我正在使用實體框架來創建基於這些表的我的類,所以我打算在我的代碼中完成它。

我想只是一個遞歸方法這樣做:

protected void DeleteUserFolder(UserFolder userFolder) 
{ 
    if (userFolder.ChildFolders.Count.Equals(0)) 
    { 
     _entities.UserFolders.Remove(userFolder); 
     _entities.SaveChanges(); 
    } 
    else 
    { 
     foreach (UserFolder childFolder in userFolder.ChildFolders.ToList()) 
     { 
      DeleteUserFolder(childFolder); 
     } 
    } 
} 

它不工作,彷彿預期,這只是刪除大約一半我的文件夾。

例如,我有一個名爲Test的父文件夾。測試有兩個子文件夾,Test2和Test3。 Test2也有兩個子文件夾。我試圖刪除Test,但它只是在Test2中刪除了Test3和子文件夾。

我在這段代碼中做錯了什麼?還是有更好的方法來做到這一點?

回答

0

事實上,我們可以創建一個通用的方法,可以充分穿越任何基於樹形結構很輕鬆地:

public static IEnumerable<T> Traverse<T>(T item, 
    Func<T, IEnumerable<T>> childSelector) 
{ 
    var stack = new Stack<T>(); 
    stack.Push(item); 
    while (stack.Any()) 
    { 
     var next = stack.Pop(); 
     yield return next; 
     foreach (var child in childSelector(next)) 
      stack.Push(child); 
    } 
} 

現在我們可以直接調用,使用數據:

foreach(var folder in Traverse(userFolder, f => f.ChildFolders)) 
    _entities.UserFolders.Remove(folder); 
_entities.SaveChanges();