2009-07-31 5 views
6

Quelqu'un peut-il me dire si/comment vous pouvez valider les changements dans un contexte de données dans Linq2Sql avant en appelant SubmitChanges(). La situation que j'ai est que je crée un contexte, effectue plusieurs opérations et ajoute de nombreux insertions aux côtés d'autres tâches de traitement, puis la restauration si la soumission échoue.Valider Linq2Sql avant SubmitChanges()

Ce que je préférerais faire est de faire une sorte d'appel "Validate()" après que certaines tâches ont été effectuées afin que je puisse le gérer avant de soumettre le travail entier.

Répondre

6

Pour obtenir tous les changements dans un contexte de données que vous pouvez appeler

ChangeSet changes = dataContext.GetChangeSet(); 

// An IList<Object> 
changes.Deletes; 
changes.Inserts; 
changes.Updates; 

Ce que j'est chaque objet de valeur a une méthode de validation. J'utilise attibutes pour définir différentes sortes de validation. La raison pour laquelle je le fais manuellement est parce que j'ai un nombre qui peut-être un int dans la base de données et le code, une valeur de 1002 pourrait être invalide si je sauve un âge. Je peux donc donner une gamme de valeurs, etc. .

Si chacun de vos objets de valeur hérite d'un objet de base, il facilite l'itération. En supposant que vous avez sur votre classe de base une méthode de validation.

Je tiens à souligner que pour que cela fonctionne, vous devrez soit modifier le code généré, ou rouler vos propres objets de valeur. Je roule généralement le mien en raison de la façon dont je les utilise pour la validation.

+0

jamais remarqué la méthode .GetChangeSet() avant! Merci pour ça! +1 – StevenMcD

+0

L'approche actuelle avec laquelle j'ai fini est de créer une classe partielle avec le nom de la table et l'implémentation du code de validation dans OnFooChanging() pour les champs que je voulais valider. Cela fonctionne pour lancer des exceptions immédiatement lorsque la valeur est définie plutôt que sur SubmitChanges(). Je n'ai pas utilisé le ChangeSet mais il m'a indiqué la bonne direction et est pratique à savoir de toute façon. –

+0

@Nick - Je me sens inutile en vous disant cela parce que je ne me souviens pas du blog où je lis, mais apparemment c'est une bonne idée de garder la validation séparée des gestionnaires "OnChange", car cela permet des scénarios de validation complexes. la validation d'une propriété dépend de la valeur des autres, etc. – Mark

5

Vous pouvez également utiliser la fonction OnValidate() avec la classe partielle de l'entité LINQ-to-SQL. OnValidate() sera alors appelé pendant SubmitChanges() mais avant que les données soient envoyées à la base de données. Une bonne chose avec OnValidate() est que vous pouvez différencier l'action CRUD par l'énumération ChangeAction.

Par exemple,

public partial class YourEntity 
{ 
    partial void OnValidate(System.Data.Linq.ChangeAction action) 
    { 
     if(action == System.Data.Linq.ChangeAction.Insert) 
      // Do insert 
     ... etc. ... 
    } 
} 
Questions connexes