112 votes

Entity Framework 4 vs NHibernate

On a beaucoup parlé de l'Entité Cadre de la première version sur le web (également sur stackoverflow) et il est clair que ce n'était pas un bon choix quand on a déjà une meilleure alternative comme NHibernate. Mais je ne peux pas trouver une bonne comparaison de l'Entity Framework 4 et NHibernate. Nous pouvons dire aujourd'hui que NHibernate est le chef de file parmi tous .NET Orm, mais peut-on attendre d'Entity Framework 4 pour déplacer NHibernate à partir de cette position. Je pense que si Microsoft a vraiment injecté de très bonnes caractéristiques en EF4, il peut donner de bonne concurrence pour NHibernate comme il a intégration de Visual Studio, plus facile à travailler et la préférence est toujours donnée à MME produits dans la plupart des magasins.

65voto

John Rayner Points 2709

EF4 a un hors-la-boîte de réponse par rapport à n-tier de développement, dans "l'auto-entités de suivi". Personne n'a publié comparable code pour le programme des ssna.

Le programme des ssna a de nombreuses fonctionnalités qui n'ont pas été mentionnés comme faisant partie de EF4. Ces inclure le cache de second niveau de l'intégration. Il dispose également d'une plus grande flexibilité dans l'héritage de la cartographie, une meilleure intégration avec stockées procs / fonctions de base de données / SQL personnalisée ou de déclencheurs, de soutien pour la formule propriétés et ainsi de suite. IMO c'est simplement plus mature comme un ORM.

37voto

Alex Burtsev Points 4251

Mise à jour: je n'ai pas utilisé le Cadre de l'Entité depuis la version 4.0, donc ma réponse ne peut être dépassée. Je suis toujours à l'aide de NH ou pur ADO .NET dans mes projets. Et je ne veux même pas regarder ce qui est nouveau en EF depuis la 4.0, parce que NH fonctionne parfaitement.

Est en fait assez facile de les comparer quand vous avez utilisé à la fois. Il y a quelques limitations graves avec EF4, je peux en citer quelques unes que j'ai rencontré par mon auto:

EF4 problèmes:

  • Désireux de Chargement et de façonner le résultat: EF4 désireux système de chargement (Include("Path")) génère une mauvaise SQL, avec le bouclage de la JOINTURE , qui exécute des milliers(pas littéralement) le temps le plus lent pour plusieurs-à-plusieurs liens à la main écrit SQL (c'est effectivement inutilisable).
  • Materializer ne peut pas se matérialiser entités associées: Si vous pouvez penser que vous pouvez surmonter le problème précédent en mettant à votre propre requête SQL, vous avez tort. EF4 ne peut pas se matérialiser(carte) les entités associées de JOINTURE SQL de la requête, il ne peut charger que les données d'une table (Donc si vous avez de la Commande.Produit, SÉLECTIONNEZ * à PARTIR de la commande LEFT JOIN Produit initialiser seulement pour l'objet, le Produit restera la valeur null, la pensée toutes les données nécessaires sont extraites dans la requête d'initialisation ). Cela peut être surmonté en utilisant EFExtensions communauté add-on, mais le code que vous devez écrire pour c'est vraiment laid (j'ai essayé).
  • L'autonomie des Entités de Suivi: Beaucoup disent que l'Autonomie des entités de suivi sont cool pour N-niveau de développement, y compris le haut de réponse dans ce fil. La pensée que je n'ai même pas de leur donner un essai, je peux dire qu'ils ne le sont pas.Chaque entrée peut être forgé, vous ne pouvez pas simplement prendre les modifications que l'utilisateur envoie vous et de les appliquer à des données de base, pourquoi ne pas donner à l'utilisateur direct de la base de données access? De toute façon, vous aurez pour charger les données de l'utilisateur est sur le point de changer de DB, vérifiez qu'il existe|n'existe pas de faire des contrôles d'autorisation, etc etc. Vous ne pouvez pas faire confiance de l'utilisateur sur l'état de l'entité, il envoie au serveur, vous serez de toute façon ont pour charge de cette entité à partir de DB et de déterminer son état et d'autres choses, de sorte que cette information est inutile, tout comme l'Auto-Suivi des sociétés, à moins que vous ne privé de confiance n-système de niveau pour un usage interne, auquel cas vous pourriez peut-être donner tout simplement DB accès. (C'est mon pensées à propos de SAINT Entités et N-pneu, je ne suis pas très expericned en N-Tier, de sorte qu'il peut changer, si j'ai mal compris quelque chose ici en commentaire)

  • Journalisation des Événements, l'intégration de la logique d'entreprise: EF4 est comme la boîte noire, il faire quelque chose et vous n'avez aucune idée de ce qu'il font. Il n'y a qu'un seul événement OnSavingChanges où vous pouvez mettre un peu de logique métier, vous devez exécuter avant que quelque chose se passe avec la DB, et si vous avez besoin d'appliquer certaines modifications à business objects avant que quelque chose arrive, vous aurez à creuser dans Vousmanager, et c'est vraiment laid, le code peut devenir énorme. Si vous, par exemple en utilisant un modèle de Référentiel et ce afin d'être informé sur les modifications apportées à la DB en propre objet manière, il vous sera difficile de le faire avec EF.

  • Extensibilité: Tous les objectifs EF code est privé et interne, si vous n'aimez pas quelque chose (et vous ne serez pas comme BEAUCOUP de choses, si vous êtes sérieux au sujet de l'EF à l'aide de), aucune façon de changer cela de manière simple, En fait, je suis sûr que c'est easer pour écrire vous même ORM à partir de zéro (je l'ai fait) puis le EF de travail que vous avez besoin. À titre d'exemple, prendre un coup d'oeil à EFExtensions source, il est basé sur les extensions de méthodes, et les différents "hacks" pour faire de l'EF peu plus utilisable, et le code est assez moche (et c'est pas les auteurs de la faute, quand tout à EF est privé, c'est la seule façon de le prolonger).

Je peux continuer à écrire de mauvaises choses sur EF et à quel point il était pour moi de travailler avec elle pour comme 20 pages, et je vais peut-être.

Qu'en est NHibernate? C'est tout à fait différent niveau, c'est comme comparer le PHP, C#, EF4, c'est comme dans l'âge de Pierre, c'est comme EF 10 ans de retard alors NHibernate dans les progrès du développement, et en fait il est, Hibernate a été lancé en 2001. Si vous avez du temps libre à apprendre et à basculer sur Nhibernate, de le faire.

25voto

zowens Points 1417

Voici la chose. NHibernate et Entity Framework sont vraiment, pour deux publics différents, dans mon esprit. NHibernate serait mon choix dans la construction d'un système complexe, avec des mappages, les formules et les contraintes (en gros rien de l'entreprise). Si j'ai voulu frapper le sol en cours d'exécution avec accès de données simple, je voudrais utiliser Entity Framework ou LINQ-to-SQL. NHibernate n'a pas vraiment de "glisser-déposer" de l'expérience tout à fait comme les EF. Les deux ont leurs atouts et leurs inconvénients. Comparer des pommes avec des pommes, franchement, ne mène nulle part.

23voto

Joel Mueller Points 14985

Si vous pensez que vous pourriez jamais vouloir pour exécuter votre code sur Mono, NHibernate est probablement un meilleur choix, peu importe ce que la fonction de listes de vérification dire...

Edit, 8/13/2012:

Entity Framework a été open-source, et est maintenant inclus dans le Mono de 2.11.3. Cette réponse est aujourd'hui obsolète et ne doit pas être invoqué.

http://weblogs.asp.net/scottgu/archive/2012/07/19/entity-framework-and-open-source.aspx

11voto

Martin R-L Points 2300

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X