6
votes

EF4 Code-premier vs modèle-d'abord en ce qui concerne la validation du modèle

Je travaille sur un projet one-man ASP.NET MVC 3 (j'ai un contrôle complet sur le schéma et le code de la base de données), et j'essaie de décider entre la base de données de la base de données - Premier et Poco W / Mes modèles EF4, ou si je devrais aller avec le code - premier.

La principale chose que j'essaie d'atteindre est de décorer mes modèles avec des attributs de basenotation afin que je puisse appliquer la validation du schéma avant de faire toute persistance. En regardant Article de Scott Guthrie À propos de la validation du modèle W / MVC 2, il parle d'article sur le fait de le faire avec le code - premier (étape 2) et de le faire avec le modèle - premier (ou la base de données) en utilisant "Cours de copain" (étape 5).

J'ai historiquement fait ma conception de la base de données à l'aide de l'interface graphique SQL Server Designer (et des scripts), donc je suis certainement plus productive avec celle, strictement en matière de conception de la base de données. Toutefois, à moins que je fesse l'idée de décorer mes modèles avec des attributs à la validation, je vais enfreindre sèche en cas de propriétés modèles dans deux classes, mais qui devront, en substance, construire mon schéma à deux endroits.

Je cherche quiconque a eu une expérience avec les deux méthodes (ou même une méthode) et peut offrir des commentaires de quelle manière ils sont allés, pourquoi ils ont décidé et comment ils ont trouvé cela pour travailler. J'aimerais aussi savoir si je serais peut-être mieux d'aller d'aller complètement différent, à l'aide d'outils tels que la validation fluide, ou peut-être même d'abandonner la validation du niveau du modèle de domaine et de garder ma validation dans les services et de voir les modèles.


0 commentaires

3 Réponses :


0
votes

Vous ne validez pas vraiment sèche ici. Le concept de sec est un peu plus nuancé que la simple duplication du code. Il existe des compromis acceptables, en particulier lorsque des préoccupations de couplage sont prises en compte.

Lorsque les gens posent cette question, ce qui est assez souvent si vous recherchez autour de vous, je les renvoie habituellement au concept DDD des [concepts délimités] [1]. Utilisation de [REMOTE] ET FORCIER SÉCHIDE EN VIVANT LA VALIDATION ASENDUÉS POUR COMPRENDURE DES TONNES DE PRECIÉTÉS À UNE PLACE ET Fusionner les responsabilités de plusieurs couches. Logique commerciale vs. Logique de persistance et d'intégrité des données (non NULLS).

@darin dmitrov dit que cela est assez bien dans beaucoup de ses réponses qu'il a fait à cette question exacte. Validant qu'un champ requis est rempli est très différent de s'assurer que Sally a suffisamment de crédit pour effectuer un achat et doit être traité beaucoup différemment.

copié à partir d'ici: Validation personnalisée MVC 3 et sèche


3 commentaires

Merci, jfar. Je suis désolé cependant, comme je dois dire cela, principalement parce que vous ne répondez pas vraiment à ma question principale. La question du sèche n'est pas la principale raison de ce post, juste une petite partie de celui-ci. Je cherche une comparaison d'utiliser le code-premier vs modèle - premier et quelles sont les différentes compromis avec et sans égard à la validation du modèle.


@Jerad Rose - comprise, il suffit d'essayer de retirer le sec de la conversation.


Pas de problème, j'ai probablement besoin de creuser davantage pour comprendre sec. Pour moi, j'ai toujours pensé que cela signifiait que si vous aviez une sorte de licenciement logique, il s'agit d'une violation du sec. Mais cela ressemble à vous dire que ce n'est pas toujours le cas, alors j'ai besoin de comprendre quand c'est acceptable / ne pas vraiment violer sec. Tous les bons articles que vous recommandez peut m'aider à mieux comprendre cela mieux?



4
votes

Premier code d'abord est dans CTP et ne dispose donc pas d'une licence Go-Live. S'il s'agit d'un projet à livrer dans les prochains mois, la décision est la décision d'abord.

Ayant dit que, les premières classes de codes utilisant des donnéesAnnotations sont plus propres que le modèle de premier modèle avec des classes de copains, mais la chose la plus importante de mon expérience est une intention explicite. Tant que votre conception est claire et que, surtout, une approche convient parfaitement.

Pour un petit projet (c'est-à-dire un homme comme vous l'avez dit), je dirais que vous allez probablement être plus productif avec le modèle d'abord et concevoir via un EDMX. Cela se sentira également plus confortable pour vous venant d'une première expérience de schéma. Il y a cependant un certain nombre de cerceaux que vous aurez besoin de passer pour que les classes de POCO fonctionnent bien, telles que l'installation du modèle POCO T4, puis modifier le modèle T4 créé dans votre projet pour tirer le POCO dans un assemblage séparé. Vous ne les voulez pas dans l'assemblée DAL qui est où ils vont commencer. Vous êtes ensuite laissé avec la décision de la manière dont vous êtes à l'aise avec des classes partielles pour la mise en œuvre de dataannotations; Pour des raisons pour des raisons, je ne suis pas d'accord avec beaucoup de gens les voient comme une design médiocre.

Dans un projet MVC, vous appuierez sur le problème sec d'omniprésents à l'aide de dataannotations avec une approche lorsque vous décidez d'utiliser des images de vue. À ce stade, vous réaliserez soudainement que l'annotation étendue de votre modèle de validation n'est utile que si vous êtes heureux d'envoyer ces classes directement à la vue. Si vous décidez de conserver les vues Léger et d'utiliser des images de vue, vous devez répéter les données de données sur la vue sur la vue, sinon vous êtes laissé avec des erreurs de validation au niveau du modèle, mais aucun moyen de l'obtenir dans la modélisation autre que l'ajout manuel. Ni le code premier ou modèle ne résolvent-il pas encore ce problème, vous devez donc concevoir en conséquence. Nous sommes personnellement allés avec un mélange et acceptons un niveau de sécheresse.


2 commentaires

Merci très bien ce que j'essayais de mieux comprendre. Bien que j'aime le pouvoir et la flexibilité, toutes ces options nous donnent, il est toujours malheureux que nous finissions souvent à faire de compromettre une chose pour en obtenir une autre. J'ai juste besoin de savoir lequel me rendra moins fou avant qu'il ne soit trop tard pour le changer. :)


Heureux d'aider Jeraad. Si vous allez d'abord le modèle, il existe un modèle T4 disponible pour prendre votre modèle EDMX et créer des premières classes de code à partir de celui-ci. Encore une autre option, désolé! Je n'ai pas encore utilisé ce modèle moi-même, il suffit donc de regarder rapidement avant de faire une décision finale de chaque sens. weblogs.asp.net/jgalloway/archive/2011/02/24/...



3
votes

Quel type de validation recherchez-vous? Voulez-vous injecter des règles de validation d'entrée utilisateur dans des entités ou souhaitez-vous une couche de validation uniquement sur les opérations de la base de données?

Il y a beaucoup de discussions puristes que les entités ne doivent pas contenir d'attributs de validation, car vous ne les utiliserez jamais dans des vues - vous utiliserez des classes de modèle de type spécial et des paramètres de validation seront directement sur les propriétés de ces classes. Pour les projets moyens et grands, je suis d'accord. Pour de simples projets de gestion de données, qui sont plus comme des formulaires sur les données (juste des opérations de crud), je suis en désaccord parce que c'est une complexité supplémentaire que vous n'avez pas besoin.

Le code EF introduit d'abord les annotations de données utilisées comme validation de la couche DB (BTW. La validation de la couche de données peut être complètement différente de la validation de l'UI). J'ai essayé exactement la même approche avec le fichier EDMX avant que cette fonctionnalité soit introduite en premier. Vous peut définir les attributs de validation pour les classes générées par EF T4 Poco Modèle également. Un problème avec ma mise en œuvre de la validation (basée sur la réflexion) était que si j'avais effectué beaucoup de mises à jour et que cela a été extrêmement lent - je ne le comparais pas au code d'abord.

EDIT:

basé sur Annonce actuelle dans l'équipe Ado.net Blog Next EF (RC prévu à la fin mars) prendra en charge la validation dans les trois approches - Code Premier, la base de données en premier, Modèle en premier. Je ne sais toujours pas si cela signifie la validation de la validation dans les implémentations basées sur DBContext et ObjectContext.


3 commentaires

Oui, je cherche principalement une couche de validation au-dessus des opérations de base de données. Comme vous l'avez dit, je prévois d'avoir des attributs de validation séparés sur mes modèles de visualisation pour la validation de l'UI, qui peuvent être identiques ou non comme mes validations de mon modèle de domaine. Fondamentalement, je veux que mon service et mes couches de domaine soient autosuffisants et être capables de gérer correctement les validations au niveau du service, plutôt que de supposer que les consommateurs de service ont déjà validé la validation. Donc, il y a en fait quelques petites choses que j'essayais de comprendre et de lire plusieurs postes sur le sujet, mais d'avoir du mal à trouver un consensus.


Il n'y a probablement pas de consensus pour le moment car de la fonctionnalité de validation de la boîte peut utiliser dataannotations dans mvc et maintenant dans dbcontext . Si vous souhaitez exécuter une validation ailleurs, vous pouvez trouver différents problèmes - j'ai construit ma solution en lisant plusieurs blogs à ce sujet.


Oui, c'est ce que je tiens à comprendre, plus je creuse. Je lisais un blog après blog, moi-même, ainsi que sur des questions à ce sujet et, en ce qui concerne cela, il n'y a pas de solution parfaite. Merci de votre aide.