2010-01-29 3 views
0

J'essaye d'implémenter un senario de suppression logique à travers toutes mes entités. Tous ont une propriété booléenne IsDeleted. Je voudrais également cascade l'association supprime aussi. J'ai commencé en ajoutant une méthode partielle pour l'entité au datacontext.Linq Logical Supprimer avec les associations

partial void DeleteQuestion(Question instance) 
{ 
    instance.IsDeleted = true; 
    ExecuteDynamicUpdate(instance); 
    foreach (var answer in instance.Answers) 
    { 
     DeleteAnswer(answer); 
    } 
} 

Ce génère une erreur Incorrect syntax near the keyword 'WHERE' à ExecuteDynamicUpdate. En regardant sql profiler je peux voir la clause set est vide, il n'enregistre pas le IsDeleted = true; comme un changement. J'ai vérifié l'événement IsDeletedChanging et il s'est déclenché mais je suppose que l'ensemble de modifications a déjà été construit à ce moment.

J'ai aussi essayé de soumettre les changements au lieu d'appeler ExecuteDynamicUpdate mais lève l'exception The operation cannot be performed during a call to SubmitChanges.

J'ai vu une discussion identique here avec la seule résolution étant d'utiliser des procédures stockées que je préfère ne pas faire.

Je pensais donc demander à la communauté SO et obtenir une bonne réponse en haut des résultats Google. Il semble y avoir peu sur ce sujet.

Merci beaucoup.

+0

Un peu hors sujet, mais parcourir toutes les Réponses et les supprimer une par une va donner de très mauvaises performances. Vous devriez probablement regarder dans le lot en les supprimant à la place. –

+0

Correct. Je vais refactoriser quand je trouve un moyen de faire la mise à jour. J'ai essayé oralement db.Answers.DeleteAllOnSubmit (instance.Answers) mais cela jette l'opération "ne peut pas être effectuée lors d'un appel à l'exception SubmitChanges" – madcapnmckay

Répondre

1

Avez-vous vraiment besoin de conserver l'état supprimé dans l'ensemble de la hiérarchie de confinement?

Dites que vous avez une question "Q" et répondez "A" et "B". À un certain point, vous avez supprimé "A". (état 1) "Q a B".

Maintenant vous safedelete "Q", en espérant que lorsque vous annulez "Q" vous obtiendrez (état 1). Mais safedelete a mis "B" à l'état supprimé, et undelete a mis tous les enfants de "Q" à l'état non supprimé, alors vous obtenez "Q a A, B". Les opérations safedelete et undelete ont détruit l'état des éléments de collection enfants. J'appelle ce concept "édition destructive", ce qui signifie que les opérations sont irréversibles et rend la suppression logique pratiquement inutile.

Je recommanderais d'utiliser "l'édition non-destructive", ce qui implique l'inférence de l'état IsDeleted de la hiérarchie de confinement. Si un parent IsDeleted, cela signifie qu'un enfant est également considéré comme supprimé.

0

Il semble que vous appeliez DeleteQuestion directement dans votre code. Tu ne devrais pas faire ça. Cette méthode partielle est appelée à la suite d'une action Delete. Par conséquent, l'instance transmise dans votre méthode partielle a déjà été ciblée pour une suppression, c'est pourquoi cette méthode est appelée par Linq à SQL. Il semble que vous appeliez cette méthode vous-même, puis que vous essayiez de supprimer l'instance transmise en tant que paramètre. Ce n'est pas ce que tu veux faire.

+0

Je n'appelle pas cette méthode moi-même J'intercepte l'appel delete pour changer son comportement. Je voudrais changer une suppression physique en une suppression logique. Une idée de ce que je devrais faire? – madcapnmckay

+0

@madcapnmckay - Quelle est la différence entre une suppression physique et logique? –

+0

Physique - la ligne est supprimée.Logique la ligne reste mais est marqué comme supprimé. – madcapnmckay