web-dev-qa-db-fra.com

Framework d'entité vs NHibernate - Performance

Je cherche à implémenter un ORM dans notre système. Nous avons actuellement de nombreuses tables avec de nombreuses données horribles et des procédures stockées. J'ai entendu dire que l'utilisation d'un ORM peut ralentir le système. Quelqu'un sait-il quel ORM est meilleur en termes de vitesse et de performances à l'aide de requêtes créées dans le code C # et de mappage vers des procédures stockées?

Merci

ÉDITER:

Le projet utilisera des tables existantes qui sont grandes et contiennent beaucoup de données, il utilisera également des procédures stockées existantes qui exécutent des tâches complexes dans une base de données SQL Server. L'ORM doit pouvoir effectuer des transactions et avoir des performances élevées lors de l'exécution des procédures stockées existantes et de l'interrogation des tables actuelles. Le projet est basé sur le Web et utilisera les services Web WCF avec DDD. Je peux voir que EF est beaucoup plus facile à utiliser et a un meilleur support mais si NH est l'option la plus appropriée?

21
Funky

Entity Framework met constamment en œuvre de nouvelles fonctionnalités et tout est automatisé dans votre projet. Il est très facile d'utiliser Entity Framework, d'étendre et de refactoriser votre code. Visual Studio l'intègre (Code-First, Database-first, Entity-First ...) comme un charme. Windows Azure facilite son déploiement et sa modification. De plus, Visual Studio peut générer toutes vos pages CRUD en 3 clics.

Je vous suggère d'utiliser EF mais cela dépend de votre projet. Pouvez-vous nous donner plus de détails à ce sujet?

Vous pouvez trouver de nombreux tableaux de comparaison sur Google, par exemple celui-ci explique les performances et celui-ci les différences.

ÉDITER:

Pouvez-vous quantifier le nombre d'utilisateurs dans votre application?

Lorsque vous utilisez Database-First dans EntityFramework, il est très facile de importer et utiliser des procédures stockées , pour NHibernate assez simple également. Notez que si vous utilisez beaucoup de procédures stockées et pas beaucoup d'utilisateurs simultanés, le choix d'un ORM entre ces deux peut ne pas être si crucial.

N'oubliez pas non plus que les performances d'un outil sont souvent basées sur la manière de l'utiliser. Si vous abusez de l'ORM (par exemple async, chargement paresseux/impatient, classes de base, ...), les performances chuteront considérablement.

Vous pouvez peut-être les installer tous les deux, regarder comment ils fonctionnent et vérifier leur feuille de route (par exemple Entity framework ) pour vérifier l'évolution et l'intérêt.

10
glautrou

Les deux sont d'excellentes solutions, bien que je pense personnellement que NHibernate est meilleur pour une base de données héritée. Voici une bonne comparaison par fonctionnalité -

http://www.dennisdoomen.net/2013/03/entity-framework-56-vs-nhibernate-3.html

Il y a certaines choses qui sont clairement meilleures dans NHibernate, comme la prise en charge de la mise en cache de deuxième niveau. La documentation est probablement un peu plus clairsemée que EF, mais si vous êtes prêt à passer par la courbe d'apprentissage, NHibernate vous donne beaucoup plus de puissance.

FluentNHibernate est idéal pour le mappage typé des classes aux tables sous-jacentes, mais il y a des endroits où vous n'aurez qu'à revenir aux mappages XML. Il existe cependant une nouvelle API concurrente de NHibernate lui-même, et je ne l'ai pas encore vérifiée (le blog ci-dessus le mentionne).

Si vous souhaitez compter sur la prise en charge des outils VS, EF est préférable. Cependant, il y aura parfois de la magie (par exemple, EF peut utiliser la réflexion pour même remplir les propriétés privées d'un objet, NHibernate ne le fait pas; c'est une force ou une faiblesse selon la façon dont vous le voyez). EF fonctionne également bien avec d'autres frameworks fournis par Microsoft (par exemple, les services RIA). J'aime aussi les migrations EF-auto (lorsque vous utilisez d'abord le code).

Si vous voulez plus de pouvoir entre vos mains et que vous voulez pouvoir affiner le fonctionnement des choses avec une séparation claire des préoccupations (l'ORM ne fait que ce que l'ORM devrait faire), NH semble être mieux. Cependant, il est un peu irritant de rendre toutes les propriétés virtuelles pour que NH puisse y accéder.

J'ai utilisé les deux et cela peut parfois devenir un peu maladroit dans les deux cas pour générer le sql que vous voulez; dans ces 5 à 10% des cas, descendez d'un niveau de plus et utilisez un micro-orme comme Dapper, Massive ou Petapoco.

ÉDITER:

NHibernate peut aussi peupler des propriétés privées, apparemment, donc ce n'était que de l'ignorance de ma part.

6
Roopesh Shenoy

EF 5 ou 6 sur .NET 4.5 est un moyen sûr d'augmenter les performances, ne vous attendez pas à une amélioration de la vitesse avec EF 5 sur .NET 4.0, cela est documenté par Microsoft. (Nous avons également un autre problème avec les déclarations LINQ mal écrites).

En général, si les performances sont prioritaires, vous ne pouvez pas battre ADO.NET avec les procédures stockées. Vous ne pouvez tout simplement pas. Ajout d'ORM, ajout et IOC conteneur ... combien de tests de performances voulez-vous faire?

Faire tourner quelques VM avec JMETER et frapper un serveur avec EF et en frapper un autre avec NHibernate, vous forcez simplement JMETER à faire suffisamment d'appels à URLS et à tester le nombre d'utilisateurs simultanés et vous devriez voir où se trouve votre goulot d'étranglement.

6
Tom Stickel

vérifier cette illustration Quelques avantages de NH sur EF

  1. NH a 10+ stratégies de génération d'ID (IDENTITY, sequence, HiLo, manual, increment, plusieurs GUID, etc.), EF n'a que l'IDENTITY manuel ou SQL Server;
  2. NH prend en charge les propriétés paresseuses (remarque: pas les entités, c'est pour les propriétés de chaîne, XML, etc.), EF non;
  3. NH a un support de cache de deuxième niveau (et, croyez-moi, les développeurs d'entreprise l'utilisent) et EF ne le fait pas;
  4. NH prend en charge les types personnalisés, même complexes, avec des propriétés "virtuelles", ce qui inclut l'interrogation de ces propriétés virtuelles, EF non;
  5. NH a des propriétés de formule, qui peuvent être n'importe quel SQL, EF non;
  6. NH a des filtres automatiques pour les entités et les collections, EF non;
  7. NH prend en charge les collections de types primitifs (chaînes, entiers, etc.) ainsi que les composants (types complexes sans identité), EF ne le fait pas;
  8. NH prend en charge 6 types de collections (liste, ensemble, sac, carte, tableau, tableau d'identification), EF n'en prend en charge qu'une;
  9. NH inclut un générateur de proxy qui peut être utilisé pour personnaliser les proxys générés, EF ne le permet pas;
  10. NH a 3 options de mappage (.HBM.XML, par code, par attributs) et EF seulement deux (par attributs, par code);
  11. NH permet le traitement par lots de requêtes et d'insertion (c'est parce que EF ne prend vraiment en charge que les clés IDENTITY), EF ne le fait pas;
  12. NH a plusieurs stratégies de contrôle optimistes (colonne sur la base de données, y compris ORA_ROWSCN d'Oracle, horodatage, version entière, toutes, colonnes sales), EF prend uniquement en charge TIMESTAMP de SQL Server ou tout
5
Muhammad Nasir

Il peut être utile d'ajouter ici qu'Entity Framework a des problèmes lors de la connexion de graphiques déconnectés et qu'il manque des fonctionnalités telles que la fusion dans Nhibernate. Vous pouvez l'adresser avec d'autres plugins, mais pas là-bas. Voici un lien vers la fonctionnalité sur Codeplex demandant un meilleur support pour travailler avec des entités déconnectées, et il y a d'autres discussions.

3
Mickey Puri