60 votes

Vote de confiance du framework d'entité - pertinent dans .NET 4?

Je suis de décider sur un ORM pour un gros projet et il était déterminé à aller pour ADO.NET Entity Framework, en particulier sa nouvelle version qui est livré avec .NET 4. Au cours de ma recherche pour plus d'informations sur EF je suis tombé sur ADO .NET Entity Framework Vote de Confiance dont je ne suis pas sûr de savoir comment prendre.

Le Vote de Confiance a été écrit parfois en 2008 pour convaincre Microsoft écouter certains critiques pour EF v1.

Il n'est pas clair si les allégations faites dans le Vote de Confiance sont toujours valables (dans .NET 4) et si elles sont suffisamment graves pour utiliser d'autres solutions. NHibernate est une mature alternative, mais je ne sais pas quels sont les problèmes qu'il apporte. Je suis en général plus enclin à une solution Ms, principalement parce que je peux compter sur l'intégration avec VS et sur leur support de développeur.

J'aimerais avoir des exemples de la façon dont les problèmes mentionnés dans le Vote de Confiance de l'affecter dans le monde réel des projets. Plus important encore, sont les revendications de l'-il encore pertinent dans EF .NET 4?

64voto

Craig Stuntz Points 95965

J'ai toujours eu l'impression que beaucoup de ce qui sous-tend le "vote de confiance" a été une tentative d'utilisation de l'EF comme si c'était un NHibernate clone. Il n'est pas, et même en EF 4 la tentative d'utilisation de l'EF comme s'il s'agissait d'un NHibernate knockoff est probablement à l'échec, même si vous pouvez obtenir un peu plus loin avant d'échouer. Comme un exemple trivial, la plupart des gens utiliser LINQ dans NHibernate sur une base minimale, si à tous, alors que je ne pense pas que vous puissiez être productif en EF à tous , sauf si vous utilisez LINQ assez fortement.

D'autre part, j'ai assez bien réussi à l'utilisation de l'EF 1 sur ses propres termes, et ont réussi à ne pas autoriser les demandes que font les gens dans les messages blog pour obtenir de la manière de le faire fonctionner pour moi. J'ai hâte d'utiliser de nombreuses fonctionnalités nouvelles en EF 4, mais je serais heureux de travailler sur un bien structuré EF 1 projet en tout temps. (D'ailleurs, je suis heureux de travailler avec NHibernate, trop, et de ne pas critiquer, de ne pas agir comme l'EF.)

Donc, je suis en train de suggérer, de manière un peu délicat de sorte que, avant que vous pouvez décider si "les demandes formulées dans la motion de censure sont toujours valables (dans .NET 4)..." vous devez d'abord décider si ces demandes ont été toujours valable pour vous et la façon dont vous travaillez. Si votre compréhension personnelle de l'O/R est câblé à NHibernate, puis EF 4 est probablement encore va sembler deuxième taux pour vous. Si, d'autre part, vous êtes prêt à apprendre l'EF façon de travailler, alors même probablement EF 1 semble mieux que vous avez entendu.

Pour remédier à la "non-confiance" réclamations directement, et d'examiner à la fois de leur substance et ce qui a changé en EF 4:

IMMODÉRÉ DE CONCENTRER LES DONNÉES DE L'ASPECT DES ENTITÉS CONDUIT À LA DÉGRADATION DE L'ENTITÉ ARCHITECTURES:

C'est une mauvaise compréhension de l'Entité Cadre du modèle de données d'entité. (Ou, une différence d'opinion, si vous préférez.) Mais de toute façon, c'est une fonction, pas un bug. Entity Framework est conçu autour de le cas plus général des services de données, pas seulement O/R de la modélisation, en particulier. Mettre des comportements sur les entités retournées à partir d'un service de données conduit à une CORBA style de catastrophe. Contrairement à l'Orm où vous êtes, à un certain degré, coincé avec quelque soit le type sort de l'ORM blackbox, avec le modèle d'Entity Framework, vous êtes attendus du projet sur les types d'entreprise. Dans ce cas, le cartographié les types d'entité ne sera plus jamais matérialisé.

C'est une différence de fond entre le modèle d'Entity Framework et de nombreux autres Orm. Personnellement, je trouve la séparation d'affaires des comportements à partir de mappage O/R pour être tout à fait un peu plus propre que de regrouper ensemble. Vous n'avez pas à être d'accord avec cette idée, mais c'est clairement une décision de conception, pas d'un oubli.

L'EXCÈS DE CODE NÉCESSAIRES POUR FAIRE FACE À L'ABSENCE DE CHARGEMENT PARESSEUX:

L'EF 4, pour le meilleur ou pour le pire, a lazy loading.

Je dis "pour le meilleur ou pour le pire" parce que le chargement paresseux, il est très facile de générer un excès de requêtes de base de données. Il fonctionne très bien aussi longtemps que vous gardez un œil attentif sur ce qui se passe sous le capot, mais la plupart des gens ne font pas cela. Je trouve projection à être une meilleure alternative pour le chargement paresseux, désireux de chargement, ou le chargement explicite la plupart du temps.

Encore, il ya des moments où le chargement paresseux est pratique. Je suis donc heureux de le voir s'ajouter en EF 4.

PARTAGÉ, MODÈLE CANONIQUE CONTREDIT DE LOGICIELS MEILLEURES PRATIQUES:

Il est difficile de savoir quoi faire de même, comme le texte qui l'accompagne n'est même pas cohérent de l'anglais, par exemple:

Les sujets aux pannes modèle canonique approche n'était pas difficile pour un manque d'élaborer l'outillage, le long de la lignes de l'Entity Framework.

Cette section semble suggérer que l'Entity Framework impose un certain type d'exigence, ou au moins une forte orientation vers l'aide d'un seul modèle de données canonique d'un système complexe. Je ne suis pas sûr que je suis d'accord, mais c'est difficile à dire, étant donné l'absence d'un exemple dans cette section. Je vais donc vous raconter mes propres préjugés sur le sujet, et vous pouvez être d'accord ou pas d'accord avec moi:

C'est souvent une erreur d'utiliser un seul modèle pour un système plus large, en fonction de la taille du système est en réalité. Rien dans le Cadre de l'Entité exige l'utilisation d'un modèle unique, cependant. D'autre part, le Cadre de l'Entité, en particulier dans la version 1, ne pas sortir de sa façon de faire, il est facile de combiner plusieurs modèles.

Maintenant, une seule grande application pour un système complexe peut être aussi grand d'une erreur, car un seul modèle de données. Donc, il ne serait pas correct pour Entity Framework pour le rendre facile à combiner beaucoup de petits modèles dans une trop grande application; ce serait tout simplement de remplacer un problème par un autre.

D'autre part, je pense qu'il fait sens pour le rendre facile la construction d'un grand système de services cloisonné dans une manière qui corresponde au domaine du problème. Je pense que les services de données WCF, une technologie distincte de l'Entity Framework, mais celle qui prend en charge le Cadre de l'Entité très bien, sont utiles pour cela.

Je pense que l'Entity Framework pourrait, dans une version future, le rendre plus facile à combiner deux ou trois modèles dans une seule application si nécessaire. Vous pouvez le faire maintenant, mais il y a quelque travail manuel impliqués. Mais comme je l'ai dit ci-dessus, je ne veux pas de "résoudre" un problème d'un trop grand modèle de données en faciliter/encourager la création d'une trop grande demande.

MANQUE DE PERSISTANCE IGNORANCE EST LA CAUSE DE LA LOGIQUE D'ENTREPRISE À ÊTRE PLUS DIFFICILE À LIRE, ÉCRIRE ET MODIFIER, CAUSANT DE DÉVELOPPEMENT ET LES COÛTS DE MAINTENANCE D'AUGMENTER À UN EXAGÉRÉE DE TAUX:

Cette section contient des allégations qui me semble erronée:

Entity Framework encourage l'Anémie du Modèle du Domaine de l'anti-modèle en décourageant l'inclusion de la logique métier dans les classes d'entité.

Voir ci-dessus. Je pense que le travail de la des types d'entité est à la carte entre de l'espace relationnel dans l'espace objet. Par le Principe de Responsabilité Unique, ces types ne doivent être modifiés que lorsque leur seule changements d'emploi. Si les processus d'affaires de changer, alors c'est une responsabilité sans rapport avec mappage O/R. Peut-être les limites d'autres Orm imposer une barrière technique sur la séparation de ces responsabilités. C'est bien de plier les règles lors de la technologie dicte, si le coût de la conception de la pureté est excessif. Mais je suis fortement en faveur de l'approche du comportement-moins de types d'entité.

Dans son état actuel, EF les classes d'entité ne peuvent pas être efficacement unité testée indépendamment de la base de données.

C'est tout simplement faux. Celui qui a écrit cela n'a pas compris de quoi ils parlaient. Aucun de nos tests unitaires toucher la DB, jamais, et beaucoup d'entre eux concernent l'EF.

Dans la mesure où la substance du titre de cette section, il y a un changement pour EF 4. Il est maintenant possible d'avoir entièrement ignorant la persistance des types d'entité, si cela aide votre conception. Cependant, à partir de la version la plus ancienne de l'Entité Cadre sur les mots, vous avez été en mesure de projeter sur POCOs. Donc, la persistance de l'ignorance a toujours été disponible quand il le faut. Ayant l'ignorance de la persistance des types d'entité se permet le suivi des modifications avec un ignorant la persistance de l'objet. Qui peut être utile dans certains cas. Mais il est sensiblement plus petit sous-ensemble de cas que de fausses allégations sur les tests unitaires, ce qui réduit l'impact du point le document fait par beaucoup.

EXCESSIVE DES CONFLITS DE FUSION AVEC LA SOURCE DE CONTRÔLE DANS DES ENVIRONNEMENTS D'ÉQUIPE:

La fusion est XML que réellement difficile? Si oui, on devrait peut-être regarder dans un nouvel outil de fusion. Je ne trouve pas cette problématique.

Cependant, il y a un véritable problème ici, bien que, encore une fois, c'est beaucoup plus étroit que le document affirme. Plutôt que de me répéter, je vais juste vous orienter vers mon post sur le sujet.

En EF 4, on peut utiliser le code-première les modèles plutôt que XML des modèles afin de diviser un modèle dans beaucoup de différents fichiers.

8voto

Arve Points 3665

Entity Framework s'est amélioré depuis la version 1 et ce billet de blog d'un contributeur de NHibernate compare NHibernate et Entity Framework 4.0.

5voto

Zackary Geers Points 119

Comme une personne qui a utilisé à la fois Entity Framework et NHibernate... je vous suggère fortement de NHibernate. Normalement, si un FOSS et un MS tech sont présents, je vous suggère de MS tech, mais je suis en total désaccord avec celui de l'EF. J'utilise EF4 sur un jour le jour, au travail, à nous de nous créer beaucoup de solution en raison de l'EF. Il y a deux ans, j'ai utilisé EF depuis environ un an, et puis j'ai changé d'entreprise, et j'ai travaillé avec EF pour l'année écoulée. NHibernate, il y a 2 ans, est en avance de EF4.

Voici les points qu'ils ont soulevés.

Excessive des Conflits de Fusion Avec la Source de Contrôle dans des Environnements d'Équipe:

Ceci a été partiellement résolu, à partir de ce que j'entends. Ils ont déplacé les données de position pour le concepteur de la partie inférieure de la .edmx, il n'est donc plus un problème horrible, mais toujours ennuyeux. Si moi et une collègue de travail à la fois essayer de modifier le .edmx dans le même temps, nous avons tendance à obtenir des horribles conflits de fusion, car le fond de ce fichier est utilisé pour stocker les données de position des tables dans le concepteur. Notre solution de contournement à ce problème est l'utilisation de SVN fichier de verrouillage afin de ne pas double-éditer. Ou j'ignore de verrouillage, et si je reçois un conflit de fusion, je viens d'accepter leurs changements et refaire mon travail. La plupart de mes modifications ne sont pas si grands qu'ils mettent beaucoup de temps à re-faire. Si c'était le seul problème, je voudrais vivre avec elle.

Si vous êtes à l'aide de code-first (EF 4.1) c'est un non-problème.

L'excès de Code Nécessaires pour faire Face à l'Absence de Chargement Paresseux:

Ils ont ajouté le chargement paresseux dans la version 4.0.

Mais c'est le chargement encore préformes comme un morceau de poubelle. Désireux de chargement est lent, ce qui est une commune de l'optimisation lorsque vous avez besoin pour accélérer votre code. Je suis en cours d'exécution dans les cas où j'ai à faire 10k+ les appels à la base, quand je préfère utiliser désireux de chargement. Nous avons chronométré, et dans de nombreux cas, il est plus rapide de faire de multiples appels de base de données ( myobject.TablenameReference.Load() dans une boucle) à une base de données locale, il est à utiliser .Include("Tablename"). Oui, je sais que c'est très contre-intutivie, mais les chiffres ne mentent pas. Aussi, il n'y a aucun moyen de spécifier l'extraction stragety, de sorte que vous ne pouvez pas spécifier de Rejoindre chercher ou pas. Donc, je dirais que c'est amélioré, mais pas près aussi bon que NHibernate.

Excessivement l'accent sur les données de l'aspect des entités conduit à la dégradation de l'entité architectures:

Ouais, c'est toujours aussi vrai. Encore un bon exemple est l'ordre.Statut. Nous aimerions vraiment que pour être un enum, mais en raison de la façon EF est conçu, nous n'avons pas d'autre choix en plus de rendre une chaîne de caractères. Ils peuvent fixer l'enum problème à l'avenir, mais l'absence de contrôle entre la façon dont le plan est fait entre la table et l'objet est le vrai plainte. NHibernate vous permet de spécifier les méthodes pour faire des mappages, pour faire face à ce cas.

Pour étendre un point de Craig Stuntz, EF est conçu autour si vous voulez prendre le modèle de données, et de sélectionner directement à partir de la. (IE myModel.Orders.Where(order => order.Status == "NEW").Select(order => order.Customer.FirstName, order=> order.Customer.LastName).) EF du modèle finit par être vraiment dur d'écrire des tests automatisés autour si vous ne voulez pas de frapper jusqu'à la DB. Si vous voulez un référentiel, où vous vous demandez pour un objet qui répond à certains critères, et il renvoie à l'ensemble de l'objet, c'est ce que NHibernate fonctionne mieux. (IE var order = myOrderRepository.GetByStatus(OrderStatus.New)).

Un autre problème que j'ai avec EF est-il de l'absence totale de extensiblity. Un problème que nous avons est que nous avons des Enums pour le statut de la commande. Mais si nous n' myModel.Orders.Where(order => order.Status == OrderStatus.New.ToString()), EF se crash sur cette requête, car il ne sait pas la .La méthode ToString (). Il uglifies notre code, parce que nous ne pouvons pas ajouter le support pour cela. Il ya aussi beaucoup de méthodes internes, nous avons donc besoin de provoquer un comportement étrange de se produire, nous ne pouvons pas le faire.

Si vous êtes à l'aide de NHibernate, Linq ajoute beaucoup de fonctionnalités pour nhibernate que faire beaucoup mieux. À l'aide d'une des conventions de base de modèle, il ne nécessite que très peu de code pour la plupart de vos mappages. Si vous utilisez une base de données existante, Nhibernate vous permet de spécifier non-standard conventions à utiliser, et puis demandez-leur de la carte, et tout est facilement gérés. EF 4.0 (et je ne pense pas qu'4.1) n'est pas prise en charge de quoi que ce soit.

J'espère que cela vous aide.

0voto

robert_d Points 69

Le chargement est paresseux dans EF 2, http://microsoftpdc.com/Sessions/FT10?type=wmvhigh

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