Question

Quels sont les avantages et les inconvénients de l'utilisation de l'entité Framework 4.1 First de code sur le modèle / base de données-premier avec le diagramme EDMX?

J'essaie de bien comprendre toutes les approches pour créer une couche d'accès aux données à l'aide d'EF 4.1. J'utilise le motif du référentiel et IoC.

Je sais que je peux utiliser une approche de code d'abord: définir mes entités et mon contexte à la main et utiliser ModelBuilder Pour affiner le schéma.

Je peux également créer un EDMX diagramme et choisissez une étape de génération de code qui utilise des modèles T4 pour générer POCO Des classes.

Dans les deux cas, je me retrouve avec POCO objet qui sont ORM agnostique et contexte qui dérive de DbContext.

La base de données d'abord semble être la plus attrayante car je peux concevoir une base de données dans Enterprise Manager, synchroniser rapidement le modèle et affiner l'intermédiaire à l'aide du concepteur.

Alors, quelle est la différence entre ces deux approches? S'agit-il simplement de la préférence VS2010 vs Enterprise Manager?

Était-ce utile?

La solution

Je pense que les différences sont:

Code d'abord

  • Très populaire car les programmeurs hardcore n'aiment aucun type de concepteurs et la définition de la cartographie dans EDMX XML est trop complexe.
  • Contrôle complet sur le code (pas de code autoogénéré qui est difficile à modifier).
  • L'attente générale est que vous ne vous embêtez pas avec DB. DB est juste un stockage sans logique. EF gérera la création et vous ne voulez pas savoir comment il fait le travail.
  • Les modifications manuelles de la base de données seront très probablement perdues car votre code définit la base de données.

Base de données d'abord

  • Très populaire si vous avez une base de données conçue par DBA, développée séparément ou si vous avez une base de données existante.
  • Vous laissez EF créer des entités pour vous et après modification du mappage, vous générerez des entités POCO.
  • Si vous souhaitez des fonctionnalités supplémentaires dans les entités POCO, vous devez soit modifier le modèle T4 ou utiliser des classes partielles.
  • Les modifications manuelles de la base de données sont possibles car la base de données définit votre modèle de domaine. Vous pouvez toujours mettre à jour le modèle à partir de la base de données (cette fonctionnalité fonctionne assez bien).
  • Je l'utilise souvent ensemble par rapport aux projets de base de données (seule version premium et ultime).

Modèle d'abord

  • IMHO populaire si vous êtes un fan de designer (= vous n'aimez pas écrire du code ou SQL).
  • Vous "dessinerez" votre modèle et laissez le flux de travail générer votre script de base de données et le modèle T4 générer vos entités POCO. Vous perdrez une partie du contrôle sur vos entités et à la base de données, mais pour les petits projets faciles, vous serez très productif.
  • Si vous souhaitez des fonctionnalités supplémentaires dans les entités POCO, vous devez soit modifier le modèle T4 ou utiliser des classes partielles.
  • Les modifications manuelles de la base de données seront très probablement perdues car votre modèle définit la base de données. Cela fonctionne mieux si vous avez installé le pack Power Generation de base de données. Il vous permettra de mettre à jour le schéma de base de données (au lieu de recréer) ou de mettre à jour des projets de base de données dans Vs.

Je m'attends à ce que, dans le cas de EF 4.1, il y a plusieurs autres fonctionnalités liées au Code First Vs. Model / Database First. L'API courante utilisée dans Code First n'offre pas toutes les fonctionnalités d'EDMX. Je m'attends à ce que les fonctionnalités comme la cartographie des procédures stockées, les vues de requête, la définition de vues, etc. fonctionnent lors de l'utilisation d'abord du modèle / de la base de données et DbContext (Je ne l'ai pas encore essayé) mais ils ne sont pas en code en premier.

Autres conseils

Je pense que ce simple "arbre de décision" de Julie Lerman, l'auteur de "Programming Entity Framework" devrait aider à prendre la décision avec plus de confiance:

a decision tree to help choosing different approaches with EF

Plus d'informations Ici.

La base de données d'abord et le modèle n'ont pas de réelles différences. Le code généré est le même et vous pouvez combiner ces approches. Par exemple, vous pouvez créer une base de données à l'aide de Designer, que vous pouvez modifier la base de données à l'aide du script SQL et mettre à jour votre modèle.

Lorsque vous utilisez d'abord le code, vous ne pouvez pas modifier le modèle sans base de données de loisirs et perdre toutes les données. À mon humble avis, cette limitation est très stricte et ne permet pas d'utiliser le code d'abord en production. Pour l'instant, ce n'est pas vraiment utilisable.

Le deuxième inconvénient mineur du code est d'abord que le générateur de modèle nécessite des privilèges sur la base de données maître. Cela ne vous affecte pas si vous utilisez la base de données SQL Server Compact ou si vous contrôlez le serveur de base de données.

L'avantage du code d'abord est un code très propre et simple. Vous avez un contrôle total de ce code et pouvez facilement le modifier et l'utiliser comme modèle de vue.

Je peux recommander d'utiliser la première approche de code lorsque vous créez une application autonome simple sans version et utilisez d'abord Model Database dans des projets qui nécessitent une modification de la production.

Citant les parties pertinentes de http://www.itworl

3 raisons d'utiliser le code First Design avec Entity Framework

1) Moins de crue, moins de ballonnement

L'utilisation d'une base de données existante pour générer un fichier de modèle .edmx et les modèles de code associés entraînent une pile géante de code généré automatique. Vous êtes imploré de ne jamais toucher ces fichiers générés de peur de casser quelque chose, ou vos modifications sont écrasées sur la prochaine génération. Le contexte et l'initialisateur sont également bloqués dans ce gâchis. Lorsque vous devez ajouter des fonctionnalités à vos modèles générés, comme une propriété de lecture calculée uniquement, vous devez étendre la classe de modèle. Cela finit par être une exigence pour presque tous les modèles et vous vous retrouvez avec une extension pour tout.

Avec le code d'abord, vos modèles codés à la main deviennent votre base de données. Les fichiers exacts que vous construisez sont ce qui génère la conception de la base de données. Il n'y a pas de fichiers supplémentaires et il n'est pas nécessaire de créer une extension de classe lorsque vous souhaitez ajouter des propriétés ou quoi que ce soit d'autre que la base de données n'a pas besoin de connaître. Vous pouvez simplement les ajouter dans la même classe tant que vous suivez la syntaxe appropriée. Heck, vous pouvez même générer un fichier modèle.edmx pour visualiser votre code si vous le souhaitez.

2) un plus grand contrôle

Lorsque vous allez d'abord DB, vous êtes à la merci de ce qui est généré pour vos modèles à utiliser dans votre application. Parfois, la convention de dénomination n'est pas souhaitable. Parfois, les relations et les associations ne sont pas tout à fait ce que vous voulez. D'autres fois les relations non transitoires avec le chargement paresseux font des ravages sur vos réponses API.

Bien qu'il y ait presque toujours une solution pour les problèmes de génération de modèles que vous pourriez rencontrer, le code GOOT vous donne d'abord un contrôle complet et fin à partir du get go. Vous pouvez contrôler tous les aspects de vos modèles de code et votre conception de base de données dans le confort de votre objet professionnel. Vous pouvez spécifier avec précision les relations, les contraintes et les associations. Vous pouvez définir simultanément les limites de caractères de la propriété et les tailles de colonne de base de données. Vous pouvez spécifier quelles collections connexes doivent être chargées, ou ne pas être du tout sérialisées. En bref, vous êtes responsable de plus de choses, mais vous contrôlez pleinement la conception de votre application.

3) Contrôle de la version de la base de données

C'est un gros. Les bases de données de version sont difficiles, mais avec le code d'abord et les premières migrations du code, c'est beaucoup plus efficace. Parce que votre schéma de base de données est entièrement basé sur vos modèles de code, par version contrôlant votre code source, vous contribuez à la version de votre base de données. Vous êtes responsable du contrôle de votre initialisation de contexte qui peut vous aider à faire des choses comme les données commerciales fixes des semences. Vous êtes également responsable de la création de premières migrations de code.

Lorsque vous activez d'abord les migrations, une classe de configuration et une migration initiale sont générées. La migration initiale est votre schéma actuel ou votre V1.0 de base. À partir de ce moment-là, vous ajouterez des migrations qui sont horodatrices et étiquetées avec un descripteur pour aider à la commande de versions. Lorsque vous appelez Add-Migration à partir du gestionnaire de packages, un nouveau fichier de migration sera généré contenant automatiquement tout ce qui a changé dans votre modèle de code dans une fonction UP () et Down (). La fonction UP applique les modifications à la base de données, la fonction Down supprime ces mêmes modifications dans le cas où vous souhaitez retourner. De plus, vous pouvez modifier ces fichiers de migration pour ajouter des modifications supplémentaires telles que de nouvelles vues, des index, des procédures stockées et quoi que ce soit d'autre. Ils deviendront un véritable système de versioning pour votre schéma de base de données.

Le code d'abord semble être l'étoile montante. J'ai jeté un coup d'œil à Ruby sur Rails, et leur norme est la première du code, avec des migrations de base de données.

Si vous créez une application MVC3, je crois que le code présente d'abord les avantages suivants:

  • Décoration d'attribut facile - Vous pouvez décorer les champs avec validation, exigence, etc. Attributs, c'est assez gênant avec la modélisation EF
  • Pas d'erreurs de modélisation étranges - La modélisation EF a souvent des erreurs étranges, comme lorsque vous essayez de renommer une propriété d'association, elle doit correspondre aux méta-données sous-jacentes - très inflexibles.
  • Pas gênant à fusionner - Lorsque vous utilisez des outils de contrôle de version de code tels que Mercurial, la fusion des fichiers .edmx est une douleur. Vous êtes un programmeur utilisé pour C #, et là vous fusionnez un .edmx. Ce n'est pas le cas avec le code-premier.
  • Contrez-vous en premier au code et vous avez un contrôle complet sans toutes les complexités et inconnues cachées à gérer.
  • Je vous recommande d'utiliser l'outil de ligne de commande Package Manager, n'utilisez même pas les outils graphiques pour ajouter un nouveau contrôleur aux vues d'échafaudage.
  • Db-migrations - alors vous pouvez également activer les migrations. C'est si puissant. Vous apportez des modifications à votre modèle dans le code, puis le cadre peut suivre les modifications du schéma, afin que vous puissiez déployer de manière transparente les mises à niveau, avec des versions de schéma automatiquement améliorées (et dégradés si nécessaire). (Pas sûr, mais cela fonctionne probablement aussi avec Model-First)

Mise à jour

La question demande également une comparaison du code d'abord avec le modèle EDMX / DB-premier. Le code d'abord peut également être utilisé pour ces deux approches:

J'utilise d'abord la base de données EF afin de fournir plus de flexibilité et de contrôle sur la configuration de la base de données.

EF Code First et Model ont d'abord semblé cool au début, et fournit l'indépendance de la base de données, mais ce faisant, cela ne vous permet pas de spécifier ce que je considère comme des informations de configuration de base de données très basiques et courantes. Par exemple, les index de table, les métadonnées de sécurité ou ont une clé primaire contenant plus d'une colonne. Je trouve que je souhaite utiliser ces fonctionnalités de base de données et d'autres et autres et que je dois donc faire une configuration de base de données directement de toute façon.

Je trouve que les classes POCO par défaut générées pendant la DB sont d'abord très propres, mais manquent les attributs d'annotation de données très utiles ou les mappages aux procédures stockées. J'ai utilisé les modèles T4 pour surmonter certaines de ces limitations. Les modèles T4 sont géniaux, surtout lorsqu'ils sont combinés avec vos propres métadonnées et classes partielles.

Le modèle semble d'abord avoir beaucoup de potentiel, mais me donne beaucoup de bugs lors de refactorisation de schéma de base de données complexes. Pas certain de pourquoi.

Travailler avec de grands modèles était très lent avant le SP1 (ne l'a pas essayé après le SP1, mais on dit que c'est un cliché maintenant).

Je conçois toujours mes tables d'abord, puis un outil construit en interne génère les POCOS pour moi, il faut donc le fardeau de faire des tâches répétitives pour chaque objet POCO.

Lorsque vous utilisez des systèmes de contrôle source, vous pouvez facilement suivre l'historique de vos POCO, il n'est pas si simple avec le code généré par concepteur.

J'ai une base pour mon POCO, ce qui rend beaucoup de choses assez faciles.

J'ai des vues pour toutes mes tables, chaque vue de base apporte des informations de base pour mes clés étrangères et ma vue POCOS dérive de mes classes POCO, ce qui est à nouveau très utile.

Et enfin, je n'aime pas les designers.

Exemple d'approche de la base de données:

Sans écrire de code:ASP.NET MVC / MVC3 Base de données First Approche / Database First First

Et je pense que c'est mieux que les autres approches parce que la perte de données est moindre avec cette approche.

À mon humble avis, je pense que tous les modèles ont un excellent endroit, mais le problème que j'ai avec l'approche du modèle est dans de nombreuses grandes entreprises, DBA contrôlant les bases de données que vous n'obtenez pas la flexibilité de la création d'applications sans utiliser les premières approches de la base de données. J'ai travaillé sur de nombreux projets et en ce qui concerne le déploiement, ils voulaient un contrôle total.

Donc, si je suis d'accord avec tous les variations possibles du code d'abord, modèle d'abord, la base de données d'abord, vous devez considérer l'environnement de production réel. Donc, si votre système va être une grande application de base d'utilisateurs avec de nombreux utilisateurs et que DBA exécute le spectacle, vous pourriez considérer la première option de base de données juste mon avis.

Je pense que l'un des avantages du code est d'abord que vous pouvez sauvegarder toutes les modifications que vous avez apportées à un système de contrôle de version comme Git. Parce que toutes vos tables et relations sont stockées dans ce qui ne sont essentiellement que des classes, vous pouvez remonter dans le temps et voir quelle était la structure de votre base de données auparavant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top