Quels sont les avantages et les inconvénients d'utiliser Entity Framework 4.1 Code-first sur Model / Database-first avec diagramme EDMX?
J'essaie de comprendre pleinement toutes les approches pour créer une couche d'accès aux données à l'aide d'EF 4.1. J'utilise le modèle de référentiel et IoC
.
Je sais que je peux utiliser l'approche du code en premier: 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 choisir une étape de génération de code qui utilise des modèles T4 pour générer les mêmes POCO
classes.
Dans les deux cas, je me retrouve avec un POCO
objet ORM
agnostique et le contexte qui en découle DbContext
.
La base de données en premier semble être la plus attrayante car je peux concevoir une base de données dans Enterprise Manager, synchroniser rapidement le modèle et l'affiner à l'aide du concepteur.
Quelle est donc la différence entre ces deux approches? S'agit-il simplement de la préférence VS2010 par rapport à Enterprise Manager?
Réponses:
Je pense que les différences sont:
Code d'abord
Base de données d'abord
Modèle d'abord
Je m'attends à ce que dans le cas d'EF 4.1, il existe plusieurs autres fonctionnalités liées à Code First vs Model / Database first. L'API Fluent utilisée dans Code en premier ne propose pas toutes les fonctionnalités d'EDMX. Je m'attends à ce que des fonctionnalités telles que le mappage de procédures stockées, les vues de requête, la définition de vues, etc. fonctionnent lors de l'utilisation de Model / Database en premier et
DbContext
(je ne l'ai pas encore essayé) mais elles ne le font pas en premier dans Code.la source
DbContext
qui existeObjectContext
simplement((IObjectContextAdapter)dbcontext).ObjectContext
.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:
Plus d'infos ici .
la source
La base de données d'abord et le modèle d'abord 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 du 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 que le constructeur de modèles requiert des privilèges sur la base de données principale. 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 est d'abord un code très propre et simple. Vous avez le contrôle total de ce code et pouvez facilement le modifier et l'utiliser comme modèle de vue.
Je peux recommander d'utiliser l'approche de code en premier lorsque vous créez une application autonome simple sans versionner et en utilisant model \ database d'abord dans des projets qui nécessitent une modification en production.
la source
Citant les parties pertinentes de http://www.itworld.com/development/405005/3-reasons-use-code-first-design-entity-framework
la source
Le code en premier semble être l'étoile montante. J'ai jeté un coup d'œil à Ruby on Rails, et leur standard est le code en premier, avec les migrations de base de données.
Si vous construisez une application MVC3, je pense que le code présente d'abord les avantages suivants:
Mise à jour
La question demande également une comparaison du code en premier au modèle EDMX / db en premier. Le code en premier peut également être utilisé pour ces deux approches:
la source
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.
Le code EF en premier et le modèle semblaient d'abord cool au premier abord, et offrent une indépendance vis-à-vis de la base de données, mais ce faisant, il 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, des index de table, des métadonnées de sécurité ou une clé primaire contenant plusieurs colonnes. Je trouve que je veux utiliser ces fonctionnalités et d'autres fonctionnalités de base de données courantes 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 base de données sont d'abord très propres, mais manquent d'attributs d'annotation de données très utiles, ou de mappages aux procédures stockées. J'ai utilisé les modèles T4 pour surmonter certaines de ces limitations. Les modèles T4 sont impressionnants, 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 du refactoring de schéma de base de données complexe. Pas certain de pourquoi.
la source
Travailler avec de gros modèles était très lent avant le SP1, (je ne l'ai pas essayé après le SP1, mais on dit que c'est un jeu d'enfant maintenant).
Je conçois toujours mes tables en premier, puis un outil construit en interne génère les POCO pour moi, donc cela prend le fardeau de faire des tâches répétitives pour chaque objet poco.
lorsque vous utilisez des systèmes de contrôle de source, vous pouvez facilement suivre l'historique de vos POCO, ce n'est pas si simple avec du code généré par le 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 mes vues POCO dérivent de mes classes POCO, ce qui est encore très utile.
Et finalement, je n'aime pas les designers.
la source
Exemple de première approche de base de données:
Sans écrire de code: ASP.NET MVC / MVC3 Database First Approche / Database first
Et je pense que c'est mieux que d'autres approches car la perte de données est moindre avec cette approche.
la source
À mon humble avis, je pense que tous les modèles ont une grande place, mais le problème que j'ai avec l'approche du premier modèle est dans de nombreuses grandes entreprises avec DBA contrôlant les bases de données, vous n'obtenez pas la flexibilité de créer des applications sans utiliser les premières approches de base de données. J'ai travaillé sur de nombreux projets et en matière de déploiement, ils voulaient un contrôle total.
Donc, même si je suis d'accord avec toutes les variantes possibles Code First, Model First, Database First, vous devez tenir compte de 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 DBA exécutant le spectacle, vous pouvez envisager la première option de base de données à mon avis.
la source
Je pense que l'un des avantages du code est que vous pouvez sauvegarder toutes les modifications que vous avez apportées à un système de contrôle de version comme Git. Étant donné que toutes vos tables et relations sont stockées dans des classes 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.
la source