Je cherche une solution pour effectuer une validation d'entité personnalisée (ce qui nécessiterait un accès à la base de données, une validation croisée ...) lorsque l'utilisateur enregistre ses modifications dans un écran de données dynamiques, avec Entity Framework.
La validation est plus complexe que ce que je peux faire avec les attributs (il faut un accès à la base de données, etc.)Validation d'entité avancée personnalisée avec Dynamic Data
Pouvez-vous intercepter l'appel SaveChanges?
J'ai essayé de surcharger ValidateEntity
dans l'objet DbContext, mais Dynamic Data ne semble pas l'appeler (probablement parce qu'il utilise l'ObjectContext interne, je ne sais pas pourquoi), et l'annulation de SaveChanges n'aide pas non plus.
Je ne vois pas un événement que je pourrais souscrire à ...
Le documentation devrait aider:
validation Personnaliser pour un champ de données individuelles en remplaçant la méthode OnValidate ou traiter l'événement Valider , qui sont appelées lorsqu'un champ de données est modifié. Cette approche vous permet d'ajouter la validation et la logique métier pour un champ individuel. Cette approche est plus générale que l'ajout de validation pour un champ individuel. Il est utile lorsque la même logique de validation peut être appliquée à plusieurs champs de données . Il vous permet également d'effectuer des vérifications de validation qui impliquent plusieurs champs.
Mais j'utilise POCO Entity Framework 6 classes donc il n'y a pas de méthode OnValidate
pour passer outre, et de ce que je lis ceci est pour LinqToSql, et je ne peux pas trouver l'événement Validate
qu'ils mentionnent.
J'ai essayé de souscrire à l'événement SavingChanges
du ObjectContext
intérieur dans le constructeur de mon DbContext, appeler manuellement le ValidateEntity
, mais je ne sais pas quoi faire avec le résultat. Si je lance un DbEntityValidationException
(ou un ValidationException
comme suggéré dans this article), ASPNET le gère comme n'importe quelle exception (écran jaune). La mise en œuvre de IValidatableObject
ne fonctionne pas non plus. J'ai également essayé d'implémenter mon propre DynamicValidator
pour voir ce qui se passe, mais sans succès, il semble gérer l'exception (si je remplace ValidateException
, et mettre un point d'arrêt, je le vois) mais il est toujours passé au niveau par défaut gestionnaire d'erreurs et affiche un écran jaune. J'ai dû louper quelque chose. Alors, comment effectuer une validation complexe (cross-field, avec requêtes, etc.) sur des entités avant d'enregistrer dans Dynamic Data/EF?
Je suis d'accord avec cette affirmation, je Beleive aussi que la logique métier ne doit pas être couplé avec le cadre de l'entité – Eldho
Il peut soutenir. Peut-être qu'un objet de couche de domaine pourrait avoir la validation à la place. Tant que l'horrible 'couche de dépôt devant le modèle EF' n'est pas utilisée ... – James
Je suis d'accord, mais Dynamic Data ne donne pas beaucoup d'options pour la validation. Mais le problème n'est pas là, le problème est que DbValidationException n'est pas attrapé par DynamicValidator (bien que les documents et les articles que je trouve disent qu'il devrait) donc j'obtiens un écran jaune. En ce moment je n'essaie même pas d'avoir une bonne architecture, juste pour avoir quelque chose qui fonctionne :(. –