2009-07-27 5 views
1

J'ai Dynamic dataWebsite qui utilise un SP SQL pour faire des opérations de mise à jour..J'ai un problème ici, ma fonctionnalité de suppression est également une mise à jour (réglage IsDeleted = 1) opérations. J'utilise actuellement la requête LINQ et j'appelle le datacontext.SubmitChanges() pour la suppression. Le problème est que la requête LINQ de mise à jour (qui définit IsDeleted = 1) lorsque j'appelle SubmitChanges() appelle également le SP de mise à jour qui est destiné uniquement aux opérations de mise à jour. Existe-t-il une option pour déclencher ma requête LINQ directement à DB au lieu d'appeler mise à jour SP?Aide LINQ pour site Web de données dynamiques

Employee ild = (from emp in _dataContext.Employee 
            where emp.IN_ID == int.Parse(ID) 
            select emp).FirstOrDefault(); 
ild.IsDeleted=1; 
_dataContext.Submitchanges(); 

Le code ci-dessus appelle toujours UpdateSP qui est configuré pour mettre à jour l'opération.

+0

Pourriez-vous nous envoyer votre code afin que nous puissions vous aider?> – StevenMcD

+0

Les suppressions logicielles sont un concept beaucoup plus complexe que celui qui leur est attribué: http://weblogs.asp.net/fbouma/archive/2009/02 /19/soft-deletes-are-bad-m-kay.aspx –

Répondre

0

Je ne suis pas sûr à 100% que je suis l'idée ici.

généralement pour supprimer l'enregistrement vous dire:

_dataContext.Employee.remove(ild); 
_dataContext.Submitchanges(); 

Mais il semble que vous vouliez mettre à jour tout le dossier à lire tout Enployee qui a un paramètre IsDeleted = 1 un enregistrement supprimé. En exécutant le code que vous avez actuellement, vous générez une instruction UPDATE et le UpdateSP se déclenche.

Y a-t-il une raison pour laquelle vous ne pouvez pas utiliser la méthode .remove() et supprimer ophysiquement l'entrée?

+0

C'était une exigence de l'entreprise de ne pas supprimer physiquement une ligne –

+0

Ah ok alors, dans ce cas, ma réponse est inutile. Désolé pour ça! – StevenMcD

1

Dans ce cas, pourriez-vous utiliser un proc stocké qui sera appelé tout comme votre proc de mise à jour. La suppression proc n'a pas besoin d'effectuer réellement une suppression FROM table requête, mais pourrait faire une mise à jour sur la table sous-jacente définissant l'indicateur IsDeleted selon le cas:

CREATE PROCEDURE 
    @Id int 
AS 
    UPDATE dbo.Employee 
    SET IsDeleted = 1 
    WHERE Id = @Id 

alors vous mapper cette fonction au comportement de suppression dans LINQ to SQL comme vous avez fait la méthode Update. Avec cette option, votre code client ferait simple Supprimer sur la table plutôt que de traiter avec le drapeau IsDeleted:

_dataContext.Employee.Remove(ild); 
_dataContext.SubmitChanges(); 

Dans votre modèle, je dirais que vous ne devriez pas exposer IsDeleted du tout. C'est un détail d'implémentation de base de données. Lorsque vous utilisez des suppressions logicielles, vous devez faire abstraction de votre table physique et exposer la fonctionnalité via des vues ou des fonctions de valeur de table. En tant qu'alternative à l'option de suppression logicielle, vous pouvez envisager d'inclure une table Tombstone imitant votre table transactionnelle. Lors d'une opération de suppression, utilisez un proc ou un trigger stocké pour déplacer l'enregistrement de la table transactionnelle vers la table tombstone. Avec cela, vous pouvez éliminer l'indicateur IsDeleted de la base de données et éliminez le besoin d'inclure le filtrage sur tous les accès (y compris les rapports).

+0

C'est aussi comment je vois le problème. MISEZ UNIQUEMENT la colonne isDeleted et continuez. –