2012-05-22 97 views
0

使用ObjectContext。我想通過ExecuteStoreCommand傳遞SQL查詢來做到這一點,因爲我不想僅僅爲了刪除它們而檢索所有相關實體。刪除類別及其子女/孫輩

類別表是這樣:

CatID | CatName | ParentID 

哪裏CATID是主鍵到PARENTID FK

我希望刪除類別以及所有那些 是在它之下。可以2+水平的深亞貓的,所以不同的PARENTID的

想我能做到這一點,如下,只是設置在數據庫中的外鍵刪除選項 「級聯」,但它不會讓我和它似乎並不想通過使用CatID - ParentID關係將級聯刪除關閉,並且查詢獲取 由此非常FK約束停止。

public RedirectToRouteResult DelCat(int CatID) 
{ 
    if (CatID != 0) 
    { 
     _db.ExecuteStoreCommand("DELETE FROM Categories WHERE CatID={0}", CatID); 
     _db.SaveChanges(); 
    } 

    return RedirectToAction("CatManage"); 
} 

回答

1

遞歸CTE allCategories生成層次結構中所有類別的列表。顯然,刪除部分將全部刪除。

; with allCategories as (
select CatID 
    from Categories 
    where CatID = @CatID_to_delete 
    union all 
select Categories.CatID 
    from allCategories 
    inner join Categories 
    on allCategories.CatID = Categories.ParentID 
) 
delete Categories 
    from Categories 
inner join allCategories 
    on Categories.CatID = allCategories.CatID 

select * from allCategories試試吧,不過,首先要檢查。

TEST @ Sql Fiddle

0

爲什麼不直接在批處理中發送兩條語句?

DELETE Categories WHERE ParentID = {0}; 
DELETE Categories WHERE CatID = {0}; 

如果您使用的框架「不會讓你」這樣做,那麼這樣做的權利:把你的邏輯在存儲過程中,並調用存儲過程。

+0

當類別下降三級或更多級別時會發生什麼情況。說:美國>紐約>皇后區。如果我通過它,它將僅刪除美國和紐約,因爲皇后ParentID等於紐約CatID而不是最初通過的ParentID。離開一隻孤兒貓。不是說FK會讓我在任何地方做。 – LaserBeak

+1

@LaserBeak對不起,您沒有提供任何樣本數據或表明有多個關卡。我建議澄清這個問題,這樣別人就不會像我那樣感到困惑 - 我假設了一個簡單的類別/子類別模型。 –