Modèle EF d’abord ou approche Code First?

Je sais que cette question a déjà été posée à de nombreuses resockets, car j’ai lu pas mal de messages sur le sujet à propos des avantages et des inconvénients, mais je n’arrive toujours pas à déterminer quelle approche me convient. Je suis très novice en programmation Web et je viens d’un contexte SQL DB Admin / rédaction de rapports. J’ai décidé d’essayer de créer mon propre site web qui pourrait avoir 30 à 40 tables, peut-être plus dans le futur.

J’ai examiné les deux approches et je privilégie l’approche Entity Model uniquement parce que j’aime la simplicité du concepteur et que j’aime voir le modèle entier devant moi, il montre l’image globale en un instantané. De plus, comme je ne suis pas un programmeur puissant, je suis impressionné par la manière dont il génère les POCO en utilisant le modèle de générateur DbContext et effectue toutes les liaisons entre les classes.

Cependant, bien que j’apprécie l’approche modèle premier, j’estime qu’il y a des inconvénients, je ne sais pas si ce sont des inconvénients réels ou si je ne connais pas assez l’approche du premier modèle et l’approche du premier code. nouveau à cela.

Les raisons pour lesquelles j’hésite à utiliser l’approche Model First sont:

-En grande partie parce que j’ai du mal à trouver des didacticiels sur la première approche du modèle en utilisant MVC 3. Le meilleur tutoriel que j’ai trouvé en utilisant DbContext est de Julie Lerman, mais elle ne couvre pas les classes de copains changements qui ne sont pas perdus lorsque vous régénérez les POCO. La plupart des tutoriels liés à MVC 3 semblent utiliser la première approche du Code. La plupart des gens disent que c’est parce que le tuteur ne veut pas se concentrer sur EF mais plutôt afficher plus de MVC dans les tuts. Personnellement, je pense que c’est parce que Microsoft défend la méthodologie Code First par rapport aux autres 🙂

-Si c’est une bonne pratique de créer des classes de contacts, pourquoi ne puis-je pas trouver beaucoup de tutoriels montrant cela pour MVC 3? Est-ce que Buddy Classes est un autre nom pour View Models? Et pourquoi ne puis-je pas trouver de didacticiels de Microsoft présentant ces modèles de copains / vues utilisés avec MVC 3?

-J’essayais de faire une relation de base 1 à 1 entre 2 tables. Dans le modèle, vous devez d’abord définir les clés d’identité de chaque table sur le même champ plutôt que d’utiliser un FK dans l’une des tables, ce qui peut créer un peu de confusion lorsque 3 tables ou plus sont liées entre elles par 1 ou 1 relation. . Dans le code, vous devez d’abord utiliser le générateur de modèle et le configurer manuellement. Je pense qu’en MF, vous pouvez changer la relation en allant dans le XML que je ne souhaite pas du tout.

-Plus de support / aide sur les premiers problèmes de code

Les raisons pour lesquelles j’hésite à utiliser l’approche Code First sont les suivantes:

-Je suis un codeur novice.

-Je vois qu’il est très difficile de suivre les tables et les relations au fur et à mesure que le projet se développe.

-Il n’y a pas de diagramme modèle et je dois dire que j’aime vraiment cette idée.

-Mapper des entités à la firebase database via des classes de configuration que je trouve impossible :).

La mise à jour d’une table nécessitera une modification du code et de la firebase database. Dans Model, vous ne devez d’abord modifier que le modèle, qui mettra automatiquement à jour la firebase database et le code, en précisant que si vous utilisez des classes de contacts, vous devrez peut-être les mettre à jour.

Maintenant, je vois que les gens associent quelque peu les premières approches Code et Base de données, en ce sens que Code First ne génère pas votre firebase database, mais crée manuellement une firebase database et utilise l’API du code pour y accéder.

Ma tête tourne avec toutes les options et tous les inconvénients et avantages et inconvénients. Je veux juste continuer avec la création de mon site Web et ne pas réfléchir à l’approche à adopter. Quelqu’un peut-il me donner une idée de l’approche qui, selon eux, est la plus appropriée en fonction de ce que j’ai dit et / ou de ce qui, selon eux, sera plus important à l’avenir?

Merci beaucoup Dave

C’est une question trop longue. Vous devriez diviser votre problème en plusieurs questions différentes la prochaine fois.

Code d’abord x Modèle d’abord x Base de données d’abord

Vous êtes un type de firebase database, donc la meilleure approche pour vous est une approche de firebase database incrémentielle dans laquelle vous définissez les éléments dans la firebase database (ou les outils de firebase database VS) et mettez à jour votre modèle depuis la firebase database. Cela vous donnera un grand contrôle sur votre firebase database et vous permettra de créer progressivement l’application et la firebase database. Pourquoi je pense que vous l’aimerez:

  • Vous avez déjà effectué SQL DB Admin – vous savez probablement quelque chose sur DB et comment les concevoir pour une performance – EF ne fera rien de cela pour vous. EF ne créera pas d’index pour vous etc.
  • 30-40 tables signifie que vous ne construirez pas le modèle en une seule fois. Vous allez commencer avec le petit modèle et le faire croître continuellement. Une fois que vous avez commencé à apporter des modifications à la firebase database ou à append des données d’initialisation, vous ne souhaiterez pas perdre ces modifications et les données. Code-first permet uniquement de supprimer toute la firebase database et de la recréer à partir de zéro. Model-first permet de construire la firebase database de manière incrémentale, mais vous avez besoin du pack d’alimentation de génération de firebase database Entity Designer et de VS 2010 Premium ou Ultimate (de 5 000 $ à 10 000 $).

En savoir plus sur les différences entre DB en premier, le modèle en premier et le code en premier . Une autre réponse décrit les différences entre le code d’abord et le travail avec le concepteur .

API DbContext + Database-first + Fluent mapping

Je dirais que c’est la voie la plus difficile à suivre. Vous définissez d’abord la firebase database et vous utiliserez l’API ou les annotations de données fluides DbContext pour définir le mappage. Cela nécessite une bonne compréhension de l’EF et de tous les principes derrière le mappage + la compréhension des conventions par défaut utilisées dans l’API DbContext. Cela vous donnera un contrôle agréable et explicite sur la cartographie, mais c’est le travail le plus important à faire. C’est certainement la voie la plus difficile à suivre. En outre, il n’est pas censé être utilisé, car l’API DbContext a été principalement créée pour une approche basée sur le code.

API DbContext x API ObjectContext

Une fois que vous commencez à utiliser EDMX (concepteur d’entité), vous avez le choix d’utiliser le modèle DbContext Generator T4 ou le modèle POCO Generator T4. La décision vous appartient – vous pouvez utiliser l’API DbContext (premier modèle) ou l’API ObjectContext (second modèle), qui est bien mieux documentée et vous pouvez également utiliser deux excellents livres:

  • Framework d’entité de programmation
  • Entity Framework Recepies

Tout ce que je sais à propos de l’API ObjectContext provient de ces livres, des blogs d’auteurs et de la pratique + Reflector.

DbContext API n’a actuellement aucun livre. Vous pouvez vérifier certains sites principaux pour obtenir des informations à ce sujet:

  • Blog de l’équipe ADO.NET
  • Le blog de Julia Lerman
  • Le blog de Morteza Manavi

Tout ce que je sais de l’API DbContext provient de ces blogs et de la pratique + Reflector.

Même si vous utilisez d’abord le code, vous pouvez toujours utiliser le diagramme de classes pour visualiser votre diagramme de classes (ce n’est pas la même chose qu’EDMX mais c’est suffisant pour obtenir une vue d’ensemble).

La recherche sur Stack Overflow ou le forum MSDN vous donnera des réponses sur la plupart des problèmes que vous rencontrerez avec les deux API.

MVC 3

L’utilisation de framework d’entités avec MVC 3 n’a rien de spécifique. Les classes de contacts pour les annotations de validation de données sont considérées comme une mauvaise pratique. Une classe de contact est une classe distincte utilisée comme un détenteur de métadonnées appliqué à l’entité. Un modèle de vue est la classe utilisée pour transférer des données entre le contrôleur et la vue. Le modèle de vue doit être spécifique à chaque vue avec ses propres annotations de validation car vous avez généralement besoin de différentes validations sur différents écrans de votre application lorsque vous utilisez le même type d’entité – par exemple, les écrans d’édition et d’insertion peuvent avoir des exigences de validation différentes.

Bien que cela ne soit pas considéré comme une bonne pratique, il est possible d’append des validations aux entités – vous pouvez soit créer manuellement une classe de contacts pour chacune de vos entités, soit modifier le modèle T4 pour générer des annotations directement (c’est difficile). .

Relation un à un

Oui EF nécessite la création d’une relation univoque uniquement par-dessus les clés primaires. La raison en est que EF ne prend pas en charge les clés / contraintes uniques. Il n’y a aucun moyen de contourner cela et l’utilisation de clés uniques dans la firebase database ne le changera pas.

C’est relativement simple. Si vous ne vous souciez pas du modèle de firebase database, utilisez d’abord le code. Si vous le faites, utilisez d’abord Model (ou Database First). Cela dépend de l’endroit où vous vous concentrez, du centrage des données ou du code.

J’ai examiné les deux approches et je privilégie l’approche Entity Model uniquement parce que j’aime la simplicité du concepteur et que j’aime voir le modèle entier devant moi, il montre l’image globale en un instantané. De plus, comme je ne suis pas un programmeur puissant, je suis impressionné par la manière dont il génère les POCO en utilisant le modèle de générateur DbContext et effectue toutes les liaisons entre les classes.

+

Mapper des entités à la firebase database via des classes de configuration que je trouve impossible :).

= utiliser le modèle en premier

Si c’est une bonne pratique de créer des classes de contacts, pourquoi ne puis-je pas trouver beaucoup de tutoriels montrant cela pour MVC 3? Est-ce que Buddy Classes est un autre nom pour Voir les modèles? Et pourquoi ne puis-je pas trouver de didacticiels de Microsoft présentant ces modèles de copains / vues utilisés avec MVC 3?

Cela peut être dû au fait que le code-first est quelque chose comme un nouvel enfant dans le bloc. C’est la raison pour laquelle il existe principalement un tutoriel sur le code MVC3. Model-first est «beaucoup» plus ancien et était probablement la solution la plus favorisée en période de MVC2.

Btw: Vous connaissez déjà mon opinion, que vous devriez utiliser, ce que vous préférez ou que vous trouvez le plus confortable (comme je vous l’ai dit la dernière fois que vous avez posé cette question), mais je voulais juste append quelque chose 🙂

Modifier après les commentaires:

Jetez un oeil à ces choses, qui vous aidera beaucoup avec le code beaucoup imo:

Création d’un modèle de données Entity Framework pour une application ASP.NET MVC (1 sur 10) Évaluez votre projet ASP.NET MVC 3 avec le package MvcScaffolding

++ ces superbes vidéos de MIX11 sur channel9:
Scott Hanselman montrant de nouveaux trucs dans sa manière géniale comme d’habitude
Steve Sanderson montre la puissance de MvcScaffolding

Vous pouvez utiliser les premiers exemples de modèle à partir de n’importe quelle version de MVC, si cela est votre problème principal avec le modèle en premier. La manière dont MVC gère les “modèles” n’est pas vraiment différente d’une version à l’autre. Bien sûr, il y a des améliorations au modèle de vue, etc., mais vous devriez être d’accord avec les anciens tutoriels.

Je préfère le code en premier, car j’estime qu’il existe des modèles de firebase database et des modèles de domaine et qu’ils servent à des fins différentes. L’organisation de la firebase database concerne les performances et la taille de la firebase database et ne facilite pas votre application. Avoir votre propre modèle vous permet de vous concentrer sur les besoins de votre application, quelle que soit la firebase database.

Maintenant, vous pouvez accéder à ce modèle à partir du modèle en premier, mais vous êtes plus susceptible de penser à la firebase database que vos besoins de cette manière … surtout. si vous êtes un débutant à cela.

Juste mes 2 centimes.