9
votes

Comparaison ORM: qui vient d'abord la base de données ou les classes?

Dernièrement, j'ai regardé dans les ormes basés sur .NET disponibles. J'ai remarqué que chacun finit par passer dans un ou deux camps. Dans un camp, la base de données est créée en premier et l'ORM offre un moyen plus facile d'accéder à la base de données dans une application. Dans le deuxième camp, le modèle d'objet existe en premier et l'ORM facilite la persistant du modèle d'objet dans une base de données.

Maintenant, je ne demande pas ou que vous affirmez si un camp est meilleur que l'autre. Je peux certainement voir des raisons pour chaque méthodologie de conception. Ce qui me frustrant est hors de tous les didacticiels et de «démarrage» des documents que j'ai lus ces derniers ne jamais sortir et dire au tout début »Cet outil suppose que vous commencez par un modèle de base de données / objet existant». Pour moi, cela est assez fondamental de savoir si vous utiliseriez un ou plusieurs orches.

Ainsi, après avoir fait un tas de lecture et créé un couple "World World", j'ai mis en place une série de points de balle sur les flux de travail soutenus par les ormes que j'ai examinés. Quelqu'un avec l'expérience avec ces outils peut-il me dire si j'ai fabriqué des déclarations incorrectes ou manquez complètement des points vraiment importants. Spécifiquement, j'aimerais vraiment savoir si mes hypothèses sur le point de savoir si le schéma de base de données ou le modèle d'objet devait d'abord arriver avec chaque outil est correct.

LINQ à SQL

  • la base de données devrait exister d'abord
  • fonctionne uniquement avec SQL Server
  • La classe DataContext est utilisée pour lire / écrire entre les classes et la base de données
  • DataContext peut récupération de classes physiques réelles ou de types dynamiques peut être utilisé pour créer automatiquement des types basés sur le schéma de base de données.
  • Mappage des valeurs par défaut sur les noms de table de mappage sur les noms de classe et les noms de propriété sur les noms de colonne
  • La cartographie peut être personnalisée via des attributs intégrés dans chaque classe

    subsonne (enregistrement actif)

    • Database doit être créé d'abord
    • fonctionne avec un certain nombre de technologies de base de données
    • Les classes sont générées automatiquement à partir du schéma de base de données existant à l'aide de modèles T4
    • La connexion à la base de données est totalement transparente une fois les classes générées
      • Constructeurs de classe Constructeurs d'Automagicaly Créer des enregistrements dans la base de données
      • Changer les valeurs de propriété met automatiquement la mise à jour de la base de données.

        subsonique (référentiel simple)

        • la structure de classe devrait venir d'abord
        • fonctionne avec un certain nombre de technologies de base de données
        • La classe de référentiel est créée et connectée à une base de données
        • Schéma de base de données est créé et mis à jour automatiquement lorsque des cours sont ajoutés au référentiel
          • repo.add (instance);
          • Le référentiel utilise la réflexion pour créer / mettre à jour le schéma de base de données
          • Créez une table pour chaque fois et une colonne pour chaque propriété

            NHibernate

            • Soit une base de données ou une structure de classe peut être créée en premier
              • mappage peut être créé pour correspondre à une nouvelle structure de classe à une base de données existante
              • mappage peut être utilisé pour automatiquement Générez le schéma de base de données
              • fonctionne avec un certain nombre de technologies de base de données
              • Les classes à l'intérieur de l'assemblage final sont attribuées avec les paramètres de mappage de NHibernate que les classes de cartes et les propriétés des tables et des colonnes
              • Il y a deux méthodes pour ajouter la configuration de mappage
                • Fichiers XML intégrés dans le binaire, .hbm.xml
                • Attributs ajoutés au code
                • prend en charge la configuration de mappage avancée, y compris une à une, une à une, plusieurs, beaucoup à une, beaucoup à plusieurs, héritage, etc., etc.

4 commentaires

Qu'en est-il du cadre d'entité ado.net?


Vous avez oublié le cadre d'entité. Avec EF, vous pouvez soit do premier ou premier développement de classe. Vous travaillez avec la base de données via l'entité. Vous avez également la possibilité de travailler avec plusieurs bases de données à l'aide d'un cadre d'entité.


Je ne suis tout simplement pas arrivé à regarder dans EF. De ce que j'ai lu la version 3.5 de EF n'était pas vraiment prête. On dirait que la version 4.0 a des améliorations, mais je viens d'installer vs 2010 à la fin de la semaine dernière. J'aimerais certainement entendre des réponses comparant la manière dont le flux de travail avec EF se compare aux autres ormes répertoriés.


Il y a d'abord des outils de 3ème partie autour de celui-ci et d'améliorer la DB-d'abord, et activez les modifications incrémentielles de la DB, du modèle ou des deux pour certains de ces ormes. Un de ces outils est mon complément pour VS, il ajoute des modifications de DB-> modèles et modèles incrémentiels -> DB modifications pour les L2S et EFV4 - Vous pouvez le télécharger à partir de huagati.com/dbmltools Si vous souhaitez le prendre pour un essai spin ...


3 Réponses :


2
votes

Poursuivre les commentaires qui ont soulevé une structure d'entité:

cadre d'entité (Wikipedia dispose également de certaines informations bien structurées)

  • prend en charge la première fois le code du code, le premier et le premier développement de la base de données. La différence entre le code premier et le modèle en premier est que, dans le code, vous écrivez d'abord les classes d'entité, tandis que dans le modèle, vous concevez d'abord le modèle de données d'abord et les entités sont générées sur la base de celle-ci.
  • basé sur un modèle de métadonnées (EDMX) (bien qu'il soit sans doute absent du code en premier) qui définit également des mappages; L'EDMX est un modèle XML contenant la structure de la base de données, les structures d'entité et les mappages entre eux et sont pris en charge par un concepteur intégré à Visual Studio. En premier, les mappages sont définis dans le code plutôt que dans EDMX.
  • prend en charge plusieurs technologies de base de données (j'ai utilisé MySQL et Oracle).
  • basé sur la génération de code T4 (en v4), qui permettant de générer des scénarios d'extensibilité intéressants, peut générer:
    • entités dérivées d'une classe de base spécifique au cadre d'entité (entitéObject)
    • Entités POCO qui ne dépendent pas du cadre d'entité du tout
    • Entités auto-suivantes.
    • fonctionne bien avec les services RIA (Silverlight).
    • prend en charge à peu près tous les types de relations que je pense et l'héritage avec de multiples stratégies (même s'il peut y avoir des problèmes avec certains d'entre eux).
    • Très bon support pour Linq (Linq aux entités).

      Il y a aussi Llblgen, que je n'ai pas utilisé, mais des commentaires de l'un de mes collègues, il ne défend pas aussi bien.

      J'ai utilisé Nibernate avant, bien que brièvement, et l'impression était bonne; Même si de retour, alors ce n'était pas aussi mature que maintenant, c'était toujours une très bonne bibliothèque. Je ne sais pas si je devais choisir entre NH et EF maintenant ... Je pense que j'irais avec EF parce que c'est ce que j'utilise depuis l'année dernière. Et le développement irait plus vite (pour moi seul), mais -Wise NH peut être légèrement meilleur.


5 commentaires

On dirait que NH et EF sont assez similaires maintenant?


Je ne pense pas que je suis le meilleur pour commenter cela, mais oui, je pense qu'ils sont. NH peut gérer certaines choses mieux, comme certains scénarios d'héritage de l'entité et possède plus d'extensions / plugins, etc., car il est open source. Je ne connais pas d'autres aspects de la comparaison.


Vos collègues ont classé llblgen pro comme non si génial? Pouvez-vous développer sur ce sujet?


Eh bien, maintenant je me sens un peu mal à l'aise :) C'est juste que le sens général que j'ai eu des discussions hors sujets - et avec un seul collègue en fait. Comme je ne connaissais pas Llblgen, je ne suis pas allé dans ces discussions dans ces discussions, mais j'essaierai quand j'en aurai la chance. Le commentaire de la réponse est hautement subjectif et non informé, donc je vais essayer de le modifier pour être plus au point si je reçois plus d'informations, mais c'est la raison pour laquelle je l'ai fait cw - afin que des personnes plus compétentes puissent l'ajouter; S'il vous plaît, n'hésitez pas à répertorier les fonctionnalités de la publication et même à supprimer cette ligne si vous estimez que c'est injuste.


J'ai eu une expérience positive avec LLBLGEN en utilisant une base de données - première approche (n'a pas essayé le code d'abord). @Fransbouma est l'auteur de Llblgen et je recommande ses poteaux de blog.



1
votes

Honnêtement, tout orme semi-décent peut gérer à la fois la base de données d'abord et Code Première conception.

Tous les ormes inclus dans votre question (y compris EF 4 et Llblgen Pro 3) peuvent faire soit, mais il peut y avoir des quantités différentes de douleur. Par exemple, le code d'abord pour Linqtosql n'est pas vraiment ce qu'il était destiné à faire, mais je pense qu'il existe des projets open source où cette fonctionnalité a été "boulonnée". Cela dit, il n'y a essentiellement aucune bonne raison de recommander Linqtosql étant donné que Microsoft pousse à la place de tout le monde vers l'entité.

En ce moment, NHibernate a probablement la meilleure histoire de code globale. Il est difficile de s'aventurer une opinion sur laquelle Orm possède la meilleure histoire de la base de données globale, étant donné qu'elles le soutiennent tous, et ce cas d'utilisation particulière n'est pas vraiment ce que vous devriez baser votre décision.

Choisissez un ormes en fonction de la question de savoir s'il s'agit d'une bonne orje. Les bons ormes prennent en charge la base de données d'abord et le code d'abord.


0 commentaires