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?
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?
Réponses:
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:
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».
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).
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.
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.
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.
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.
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.
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:
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.
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.
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.
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).
[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.
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.
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.
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.
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.
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.
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 dbml
fichiers. 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.
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.