Quels sont les critères d'évaluation d'un ORM pour.NET? [fermé]

30

Je cherche à évaluer les ORM.

J'ai utilisé SubSonic , Linq-to-SQL et Entity Framework . J'ai une équipe de développeurs allant des juniors aux seniors.

Quels sont les critères d'évaluation d'un ORM for.NET?

Nickz
la source
8
Il n'y a rien de mieux. Il y a beaucoup d'options qui ont un ensemble d'avantages et d'inconvénients. Chacun apporte quelque chose de différent à la table.
Tony
Un argument sur la terminologie: je dirais que SubSonic n'est certainement pas un ORM. Plus d'un .. exposant relationnel-à-objet. Il ne peut générer que des classes qui reflètent directement votre schéma de table de base de données. Cela fonctionne très bien pour la plupart, mais ce point de conception est assez important car il se situe sur un terrain de jeu très différent d'EF & NHib.
quentin-star du
1
@qstarin: cela fait de SubSonic autant un ORM que LINQ-to-SQL.
John Saunders
très bon point, John et qstarin. c'est une ligne fine ce que vous classeriez comme un exposant relationnel-à-objet. SubSonic 3.0 offre des fonctionnalités qui sont en ligne avec les concepts de l'ORM. Wiki dit. "la conversion de données entre des systèmes de type incompatibles dans des langages de programmation orientés objet. Cela crée, en effet, une" base de données d'objets virtuels "qui peut être utilisée à partir du langage de programmation." en outre sur ormbattle.net SubSonic est considéré comme un ORM. Merci à vous deux pour vos commentaires
Nickz
2
Je vois Linq-to-SQL plus comme un générateur sql glorifié qu'un ORM ...
fretje

Réponses:

43

C'est une question chargée.
Il y a beaucoup de très bons ORM abordant le sujet avec différentes philosophies.
Aucun n'est parfait et tous ont tendance à devenir complexes dès que vous vous éloignez de leur voie dorée (et parfois même lorsque vous vous y tenez).

Ce que vous devez vous demander lors de la sélection d'un ORM:

  1. Que faut-il faire pour vous?
    Si vous avez déjà un ensemble d'exigences pour votre application, alors vous devez sélectionner l'ORM qui correspond le mieux à celles-ci plutôt qu'un hypothétique «meilleur».

  2. Vos données sont-elles partagées ou simplement locales?
    Une grande partie de la pilosité dans ORM est causée par la façon dont ils gèrent la concurrence et les modifications apportées aux données dans la base de données lorsque plusieurs utilisateurs détiennent une version des mêmes données.
    Si votre banque de données est destinée à un seul utilisateur, la plupart des ORM feront du bon travail. Cependant, posez-vous des questions difficiles dans un scénario multi-utilisateurs: comment le verrouillage est-il géré? Que se passe-t-il lorsque je supprime un objet? Comment cela affecte-t-il les autres objets associés? L'ORM fonctionne-t-il près du métal du backend ou met-il en cache de nombreuses données (améliorant les performances au détriment de l'augmentation du risque de staleness).

  3. L'ORM est-il bien adapté à votre type d'application? Un ORM particulier peut être difficile à travailler (beaucoup de surcharge de performances, difficile à coder) s'il est utilisé dans un service ou assis dans une application Web. Cela peut au contraire être parfait pour les applications de bureau.

  4. Devez-vous renoncer aux améliorations spécifiques à la base de données?
    Les ORM ont tendance à utiliser l'ensemble de dénominateur commun le plus bas pour s'assurer qu'ils fonctionnent avec de nombreux backends de base de données différents.
    Tous les ORM compromettront les fonctionnalités disponibles (sauf s'ils ciblent spécifiquement un seul backend) mais certains vous permettront d'implémenter des comportements supplémentaires pour exploiter les améliorations spécifiques disponibles dans le backend que vous avez choisi.
    Une amélioration typique spécifique à db est par exemple les capacités de recherche en texte intégral; assurez-vous que votre ORM vous offre un moyen d'accéder à ces fonctionnalités si vous en avez besoin.

  5. Comment l'ORM gère-t-il les modifications du modèle de données?
    Certains peuvent mettre à jour la base de données automatiquement dans une certaine mesure, d'autres ne font rien et vous devrez faire le sale boulot vous-même; d'autres fournissent un cadre de gestion des modifications qui vous permet de contrôler les mises à jour de la base de données.

  6. Pensez-vous à coupler votre application aux objets de l'ORM ou préférez-vous gérer les POCO et utiliser un adaptateur pour la persistance?
    Le premier est généralement simple à gérer mais crée partout des dépendances sur vos objets de données spécifiques à ORM, le second est plus flexible, au prix d'un peu plus de code.

  7. Aurez-vous un jour besoin de transférer vos objets à distance?
    Tous les ORM ne sont pas égaux lorsqu'il s'agit de récupérer des objets à partir d'un serveur distant, regardez attentivement ce qui est possible ou impossible à faire. Certains sont efficaces, d'autres non.

  8. Y a-t-il quelqu'un à qui vous pouvez demander de l'aide?
    Existe-t-il un bon support commercial? Quelle est la taille et l'activité de la communauté autour du projet?
    Quels sont les problèmes rencontrés par les utilisateurs existants avec le produit?
    Obtiennent-ils des solutions rapides?

Quelques ORM que j'ai regardés:

  • XPO
    Du développeur Express: est petit et simple, centré sur le code. Ils l'utilisent pour leur framework d'application eXpressApp .
  • NHibernate
    est gratuit, mais la courbe d'apprentissage est assez raide. Beaucoup de goodies mais il est difficile de trouver ce qui est parfois vraiment pertinent dans toute la documentation fragmentée.
  • Projet LLBLGen Pro
    très mature, pas le plus simple mais beaucoup de réflexion y a été mis.
  • Entity Framework
    GEtting there. Les dernières versions sont assez bonnes et MS est à l'écoute, bien qu'il soit encore un peu jeune par rapport à d'autres ORM plus matures.
  • DataObject.Net
    semble prometteur mais est également un peu nouveau pour risquer un projet important à ce sujet à mon humble avis . Assez actif cependant.

Il y en a bien sûr d'autres.

Vous pouvez jeter un œil au site controversé ORM Battle qui répertorie certains critères de performance, mais vous devez être conscient que la vitesse brute n'est pas nécessairement le facteur le plus important pour votre projet et que les producteurs du site Web sont DataObject.Net.

Renaud Bompuis
la source
3
Sachant cela, qu'avez-vous choisi?
Steven Evers
merci Renaud Bompuis, je n'ai pas entendu parler de certains ORM répertoriés. Les informations que vous avez fournies sont un excellent sujet de réflexion, merci.
Nickz
1
@SnOrfus: toujours en utilisant XPO mais je vais migrer vers LLBLGen, il est solide, mature et vous gardez le contrôle (donc vous pouvez toujours vous salir les mains si vous en avez besoin) et cela permet une séparation plus adéquate des préoccupations et réutilisation des objets (via l'adaptateur).
Renaud Bompuis du
3
Il convient de noter que Entity Framework est désormais à la version 4.1 et vaut certainement la peine d'être examiné.
Sean Kearon
J'adore les processus stockés sur le serveur et LINQ sur le client. Essayez de voter contre! Pas de courbe d'apprentissage, pas de surprise, pas de versioning, pas de surprise!
NoChance
14

J'utilise NHibernate et je l'ai trouvé assez bon.

Dans mon cas, lié à une base de données MS SQL, mais vous pouvez vous connecter à d'autres bases de données.

Il ne faut pas longtemps pour être opérationnel - mappez simplement votre objet au modèle - J'utilise un fichier xml mais vous pouvez le faire couramment dans le code. Il y a une grande communauté, et personnellement, j'ai trouvé le travail d' Ayende très utile - j'utilise NHProf qui est un outil de profilage sql.

J'utilise principalement les fonctions prêtes à l'emploi - le mappage d'objets direct, mais j'ai également utilisé le langage de requête Hibernate, qui est assez facile à obtenir.

Sam J
la source
Attention, NHibernate peut être délicat pour les modèles plus compliqués. Tout est bien documenté et très logique, mais si vous n'êtes pas au courant, vous pouvez rencontrer des problèmes. Autrement dit, la courbe d'apprentissage est élevée, mais elle est excellente.
Matt Olenik
merci Sam, je n'ai pas utilisé nhibernate mais il semble nécessiter une configuration étendue par rapport à SubSonic, Linq-to-SQL et Entity Framework. Ce ne serait pas idéal pour mon équipe de développement.
Nickz
Si vous êtes intéressé, Ayende donne un atelier NHibernate à la conférence YOW Australia - yowconference.com.au/melbourne/events_tracks/… - en novembre / décembre. L'un des gars avec qui je travaille l'a utilisé pendant un certain temps, j'ai donc eu l'avantage de l'apprendre.
Sam J
3
@Nick la plupart de la configuration peut être automatisée. Je voudrais également consulter le complément fluide.
stonemetal
@Nick, @stonemetal a convenu, Fluent NHibernate rend les choses beaucoup plus faciles. Ce n'est pas aussi rapide que SubSonic, mais ça vaut quand même le coup d'oeil.
Matt Olenik
6

Malheureusement, dans mes trois derniers emplois, nous avions trois ORM locaux. Dans chaque cas, ils ont surtout sucé pour diverses raisons.

J'ai récemment évalué Entity Framework 4 et son support POCO (une belle solution est ici ) et je suis vraiment impressionné de voir à quel point il reste hors de mon visage et me donne l'impression de programmer à nouveau plutôt que de rassembler des données.

Jesse C. Slicer
la source
J'entends u jesse, les emplois précédents, j'ai été dans une position similaire ORMs maison. merci pour vos commentaires.
Nickz
3
Les ORM cultivés sur place sont toujours nuls. Les meilleurs sont toujours pires que les ORM publics les plus fous.
Jaco Pretorius
@JacoPretorius Il y a des contre-exemples à cela ... mais "en règle générale" ...
pst
3

J'aime beaucoup Linq à Sql. C'est simple et a un designer décent. Cependant, j'espère la terminer en faveur du framework Entity. J'aimerais pouvoir profiter de la possibilité de modifier les générateurs pour pouvoir avoir des objets personnalisés.

Le plus grand avantage que ceux-ci ont sur les autres (à mon avis) est qu'ils sont prêts à l'emploi avec VS. C'est également un point négatif dans la mesure où vous êtes à la merci de la SEP (voir Linq to Sql).

Jeremy Roberts
la source
3

[AVERTISSEMENT: je travaille pour DevExpress]

Vous pouvez voir des captures d'écran d'applications typiques créées par les cadres d'application DevExpress ici . Cette page contient également une très brève revue de nos produits. Pour des informations plus détaillées sur pourquoi , je vous suggère de consulter les pages de produits respectives sur notre site Web.

En ce qui concerne DevExpress XAF et XPO, voici une bonne explication sur pourquoi choisir nos frameworks d'application. De plus, nous fournissons un support et une documentation, ce qui est également important et mérite d'être mentionné. N'hésitez pas à nous contacter en cas de questions.

Dennis Garavsky
la source
J'utilise toujours XPO et je suis heureux des prochaines mises à jour.
Renaud Bompuis
2

Nous utilisons NHibernate + Fluent NHibernate, avec Linq-to-Sql sur de petits projets. La raison en est:

1) (Pas la raison principale) NHibernate semble avoir un facteur de "respect" plus élevé parmi les développeurs (est-ce vrai?),

2) Comparé à linq-to-SQL, nHibernate permet le mappage ORM entre les objets Db et les entités qui ne mappent pas 1-to-1,

3) Nous n'avons pas comparé de manière approfondie nHibernate à Entity Framework 4.0 mais voici une bonne comparaison: http://ayende.com/blog/archive/2010/01/05/nhibernate-vs.-entity-framework-4.0.aspx

nHibernate a quelque peu une courbe d'apprentissage abrupte et ses cartes XML peuvent être assez verbeuses, mais commencez par la documentation du site Fluent Nhibernate et revenez en arrière.

fjxx
la source
1

Il n'y a pas de "meilleur" cadre ORM car ils ont tous différentes combinaisons de forces et de faiblesses et il a tendance à être le cas si les développeurs choisissent de se concentrer sur l'amélioration d'un domaine, il y a d'autres domaines qui souffrent en comparaison (code en premier vs modèle en premier vs base de données en premier).

Il y a, d'autre part, un certain nombre de très bons, dont certains seront mieux adaptés à votre situation personnelle et à votre philosophie que d'autres.


Edit: Pour ce que ça vaut, j'utilise actuellement Linq to SQL - principalement parce que c'est là mais en partie parce qu'il fait beaucoup de bien pour un effort minimal et progressera probablement vers Entity Framework à nouveau "parce que c'est là" (bien qu'il existe également beaucoup sur EF4 qui est vrai ainsi que certaines choses qui ne vont pas). Le problème, en particulier avec ce dernier, devrait être lié aux performances, mais pour la plupart de mes cas, ce n'est pas un problème majeur et la possibilité d'exécuter Dynamic Data et OData à partir des modèles (L2S et EF) présente des avantages considérables pour moi en termes de " pas cher "gagne.

Murph
la source
Merci pour vos commentaires Murph. Je suis d'accord sur le "meilleur" ORM. Cependant, je cherche à instaurer une telle normalisation. L'utilisation de l'un des ORM aidera les nouveaux développeurs et les développeurs existants de mon équipe. Actuellement, où tout utiliser, subsonique, ADO.net, linq-to-sql et etc., se déplacer entre les projets et la maintenance devient plus difficile.
Nickz
Oh, je n'ai aucun problème avec votre recherche d'un ORM le plus approprié pour vos cas d'utilisation et je suis entièrement d'accord avec l'opportunité de poser la question ci-dessous. Je suis en train de mener une campagne futile contre l'utilisation du mot "BEST" dans les questions d'échange de piles (-:
Murph
1

Je vous conseille de jeter un œil à DevExpress XPO . Avec DevExpress XAF, cela facilitera la vie de tout développeur une fois sa courbe d'apprentissage franchie.

Yogi Yang 007
la source
XAF est basé sur XPO qui est l'ORM. XAF lui-même s'appuie sur cela et ajoute la logique et l'interface utilisateur "automatique", etc.
Sascha
Veuillez expliquer pourquoi vous pensez que DevExpress XAF facilitera la vie d'un développeur.
@Sascha, merci pour votre conseil. J'ai corrigé mon message.
Yogi Yang 007
@Mark, XAF et XPO fonctionnent à la fois comme ORM et comme générateur d'interface utilisateur, il devient donc facile pour un développeur de créer des applications fonctionnelles complètes en .NET avec un minimum de codage.
Yogi Yang 007
Un commentaire de mon côté à XAF: c'est un excellent système pour les environnements de logique métier moyennement complexes car il accélère le temps de développement pour ceux dans les facteurs. L'inconvénient est que, à des frontières données, il faut alors beaucoup de temps pour l'étendre. Par exemple, les utilisateurs hiérarchiques (ainsi que la logique comme les équipes) et «un utilisateur ne peut voir que des éléments de lui-même et / ou de ses subordonnés» ne sont pas pris en charge immédiatement. Ainsi, XAF a des avantages et des inconvénients, il doit vraiment être évalué s'il convient à un projet - à mon humble avis. Mais c'est définitivement une fondation bien faite si elle convient.
Sascha
1

Nous avons eu de la chance avec Entity Framework. Notre situation est quelque peu inhabituelle, cependant - nous faisons la collecte de données pour l'équipe de reporting, donc ils conçoivent en fait la base de données. Nous obtenons la base de données et utilisons simplement EF pour générer les classes d'accès aux données à partir de celle-ci. Fonctionne très bien pour nous, mais nous effectuons simplement des chargements de données en masse, donc je ne peux pas garantir à quel point cela fonctionne dans un environnement plus transactionnel.

TMN
la source
2
Oui, je suis un fan d'EF 4, c'est beaucoup mieux que la version précédente.
Nickz
1

NHibernate (+ FluentNHibernate) serait l'option par défaut pour moi. Il est très flexible, extensible et robuste. Il a une énorme quantité d'utilisateurs et il est très activement maintenu. L'inconvénient est la courbe d'apprentissage abrupte.

LightSpeed ​​de MindScape est simple et convivial, mais toujours assez flexible et capable. Il a une surface de conception comme L2S / EF et une implémentation UnitOfWork.

rmac
la source
LightSpeed ​​de MindScape semble vraiment intéressant.
Nickz
1

Eh bien, il n'y a pas de "meilleur" choix mais je dirais que l'ancien Linq to SQL ordinaire répond à vos besoins. Ce n'est pas un "vrai" ORM en soi, mais il est très léger et vous donne la possibilité d'écrire du code sans en avoir conscience, si cela a du sens. Ce que je veux dire, c'est que vous pouvez continuer à écrire du code comme d'habitude, sans avoir à être vraiment au courant de Linq autre que d'avoir le ou les dbmlfichiers. Vous pouvez toujours écrire des abstractions dessus, en utilisant les modèles de référentiel ou de passerelle, et L2S remplit le rôle principal d'un ORM, qui est de contourner la discordance relationnelle-objet.

Entity Framework est un peu lourd, et même si je ne l'ai que quelques instants, c'est plus "en face" que Linq à Sql de base, mais EF est beaucoup plus un véritable ORM que Linq. Je regarderais tous les critères que vous recherchez dans un ORM. Est-ce simplement parce que vous voulez éviter d'avoir à écrire du SQL brut ou, pire, avoir des centaines de procédures stockées? Avez-vous besoin de fonctionnalités supplémentaires que Linq to Sql brut ne peut pas fournir? Vous devez répondre à ces questions, mais en fonction de votre brève exigence ("léger et facile à utiliser"), je pense que Linq est légèrement plus facile que quelque chose comme Subsonic, et est intégré à Visual Studio.

Wayne Molina
la source
0

ECO :) C'est bien plus qu'un ORM tout en incluant les machines à états et les supports exécutables OCL (à savoir EAL). Il existe une version gratuite avec une limitation de 12 classes de domaine qui, je pense, devrait être assez soignée pour les petits projets.

William
la source
4
Il serait utile que vous expliquiez pourquoi.