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");
}
4

2 に答える 2

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があります。

于 2012-05-22T12:58:11.300 に答える
0

バッチで 2 つのステートメントを送信するだけではどうですか?

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

使用しているフレームワークでそれが「できない」場合は、これを正しく行います。ロジックをストアド プロシージャに入れ、ストアド プロシージャを呼び出します。

于 2012-05-22T12:39:51.143 に答える