2011-01-30 3 views
1

I ont une structure de dossiers comme celui-ci:Entity Framework entité auto référencement suppression

Folder1 
    Folder1.1 
    Folder1.2 
Folder2 
    Folder2.1 
    Folder2.1.1 
and so on.. 

La question est de savoir comment les supprimer en cascade (i.e. quand supprimer dossier2 tous les enfants sont également supprimés.). Je ne peux pas définir une action ON DELETE car MSSQL ne l'autorise pas. Pouvez-vous donner quelques suggestions?

MISE À JOUR: J'ai écrit ce proc stocké, puis-je le laisser ou il a besoin de quelques modifications?

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE sp_DeleteFoldersRecursive 
    @parent_folder_id int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF @parent_folder_id = 0 RETURN; 

    CREATE TABLE #temp(fid INT); 

    DECLARE @Count INT; 

    INSERT INTO #temp(fid) 
    SELECT FolderId FROM Folders WHERE FolderId = @parent_folder_id; 

    SET @Count = @@ROWCOUNT; 

    WHILE @Count > 0 
    BEGIN 
     INSERT INTO #temp(fid) 
      SELECT FolderId FROM Folders WHERE EXISTS 
        (SELECT FolderId FROM #temp 
        WHERE Folders.ParentId = #temp.fid) 
      AND NOT EXISTS 
        (SELECT FolderId FROM #temp 
        WHERE Folders.FolderId = #temp.fid);  

      SET @Count = @@ROWCOUNT;   
    END 

    DELETE Folders FROM Folders INNER JOIN #temp ON Folders.FolderId = #temp.fid; 
    DROP TABLE #temp; 
END 
GO 

Répondre

0

Normalement, il s'agit d'un proc enregistré ou INSTEAD OF trigger.

C'est:

  • Générez votre hiérarchie de Dossier2 du paramètre/SUPPRIME (approche CTE récursive par exemple))
  • Supprimer cette hiérarchie dans une instruction SUPPRIMER

La cascade circulaire/les violations de clé étrangère ne se déclencheront pas.

Questions connexes