J'ai besoin de choisir soigneusement .NET ORM pour une application N-TIER. Cela signifie que le serveur (service WCF), qui expose les données et le client, qui l'affiche. L'ORM devrait prendre en charge toutes les problèmes de sérialisation connexes en douceur - les objets ou collections d'objets, ou tout ce qui doit parcourir les frontières du processus. Idéalement, l'utilisation dans l'environnement multiprocess devrait être la même que dans le processus unique. P>
Les critères sont: p>
7 Réponses :
Je recommanderais l'entité framework v4. Il s'est amélioré de manière spectaculaire depuis V1 et prend en charge tout ce dont vous avez besoin sauf étant open source: p>
Sans un concepteur approprié, le FE v4 n'est également pas vraiment utilisé. Les fonctionnalités que vous appelez sont souvent uniquement faisables après l'édition du fichier EDMX. Je trouve votre point 6. Surtout pas très convaincant. Mais je suis biaisé, je sais;)
@Frans: Je suppose que j'aurais dû m'attendre à une réplique du roi de Llblgen. J'ai lu votre blog pendant un certain temps, et pendant que je déteste de le dire, vous avez souvent montré une compréhension manifeste des capacités EF (et L2S et LINQ). Le designer de l'EF V4, contrairement à la catastrophe du concepteur de EF V1, est considérablement plus flexible. Le code généré est hautement personnalisable via des modèles T4. Depuis la commutation à V4, je n'ai jamais eu à éditer l'EDMX ... qui était un problème commun avec v1. Deuxièmement, avec du code uniquement, vous n'avez même pas de fichier EDMX, et tout problème pouvant survenir à cause d'EDMX est éliminé.
En ce qui concerne le point 6, l'entrée de blog suivante sur le blog Ado.net couvre l'utilisation de modèles T4 et de workflow Windows pour personnaliser la génération: blogs.msdn.com/b/adonet/archive/2009/11/05/...
Cela aurait pu glisser votre radar, mais Llblgen Pro V3 prend en charge EF V4 (et V1) et, comme je l'ai écrit tout ce code de soutien, je sais vraiment beaucoup de choses à ce sujet;) S'il vous plaît voir cette vidéo: Weblogs. ASP.NET/FBOUMA/ARCHIVE/2010/04/28/... Le concepteur EF V4 pourrait fonctionner pour vous, j'aimerais vous voir l'utiliser dans le modèle d'abord avec un système de 100+ Table. Le code d'abord est loin de faire, je ne considère pas qu'un argument. Vous semblez aimer EF, génial, mais être réaliste s'il vous plaît. C'est tout.
Un autre vote pour EF ici. p>
Testable très facilement unitaire. Vous pouvez écrire vos propres entités de domaine et les faire être raisonnablement exemptes de sensibilisation à la persistance en utilisant Approche POCO . Vous pouvez ensuite vous moquer de l'interface de base de données et tester la logique de l'application sans base de données réelle. P> LI>
prend en charge Linq afin que si vous écrivez correctement votre LINQ, il ne fera que traduire une seule instruction SQL étant envoyée sur le serveur. P> LI> ul>
J'utilise un produit appelé LightSpeed , ça fonctionne très bien Et s'intègre de manière transparente dans Visual Studio 2010 et 2008. Je l'utilise avec SQLite, mais elle prend en charge de nombreux SGDBR. Il possède également une très belle fonctionnalité qui vous permet de créer des objets POCO pouvant être utilisés avec WCF, excellent économiseur de temps! Au début, j'utilisais l'édition Express Free, mais bientôt mis à niveau. P>
LightSpeed est la meilleure modélisation de domaine de domaine haute performance et de mapping O / R disponible. Première classe LINQ Support, Visual Studio 2008 et 2010 Intégration designer et notre célèbre cadre de base haute performance signifie que vous pouvez créer des modèles riches et axés sur le domaine plus rapidement que jamais auparavant. P> blockQuote>
ayant travaillé avec ce qui suit: p>
NHibernate P> LI>
llblgen p> li>
cadre d'entité p> li>
linq à sql p> li>
dataObject.net p> li>
openAccess p> li>
datables p> li> ul>
Je peux très certainement dire que les datables sont supérieurs ... non je plaisante. Tous ont leurs forces et leurs faiblesses. P>
Principalement, j'ai constaté que ces forces et ses fekanesses sont associées au type général d'ormes, qui tombe dans les deux catégories suivantes p>
poids lourd p>
LLBLGEN, OpenAccess, Entity Framework (Pre 4.0), DataObjects tombe tous dans cette catégorie. Les orateurs de poids lourds ont généralement des entités et des collections qui héritent d'une classe de base spécifique à l'orj (ie. Entitébase). Ces orateurs offrent souvent des fonctions de prise en charge du temps de conception riche, de génération de code et de fonctionnalités d'exécution approfondies (telles que le suivi de l'état, le suivi des transactions, la maintenance d'association, etc.). p> li>
Le développement plus facile, le développement plus rapide d'Upfront exploitant l'API intégré pour interagir avec des entités elles-mêmes au moment de l'exécution (c.-à-d. de llblgen entity.fields ["myfield"]. Ischanged ou entité.Indew ou entité.fields [ "Myfield"]. DBValue P> Li>
Le con: lourdité et dépendances. Avec ces ormes, vos objets professionnels sont maintenant liés directement dans l'API ORM. Et si vous voulez changer d'une autre orm? Et ce qui permet aux développeurs juniors d'abuser des fonctionnalités avancées de l'API ORM à résoudre un problème simple avec une solution complexe (j'ai vu cela une tonne)? L'utilisation de la mémoire est également un gros problème avec ces ormes. Une collection de plus de 5 000 entités et plus peut facilement prendre 100 Mo de RAM avec certains des orateurs ci-dessus. La sérialisation est un autre problème. Avec la lourdeur des objets, la sérialisation peut être très lente ... et cela ne fonctionnera probablement pas correctement désériorialiser de l'autre côté du fil (WCF ou .NET Remoting, etc.). Les associations risquent de ne pas être ré-associées correctement ou certains champs peuvent ne pas être préservés. Plusieurs des ormes ci-dessus ont construit des mécanismes de sérialisation pour améliorer le support et la vitesse ... mais aucun que j'ai vu offrir une prise en charge complète pour différents formats (c'est-à-dire que vous obtenez un support de sérialisation binaire, mais pas JSON ou XML). P > li> ul> li>
poids léger p>
linq à SQL, cadre d'entité POCO, NHibernate (sorte de) tomber dans cette cateogry. Les ormes légers utilisent généralement des POCOS que vous pouvez concevoir vous-même dans un fichier dans VS (bien sûr, vous pouvez utiliser un modèle T4 ou un générateur de code). P> LI>
Le pro: léger. Le garde simple. ORM Agnostic Business Objects. P> LI>
Le con: moins de fonctionnalités, telles que la maintenance graphique d'entité, le suivi de l'état, etc. p> li> ul> li> ul>
Quel que soit le choix que vous choisissez, ma préférence personnelle consiste à coller à Linq, et à la syntaxe de récupération indépendante de l'orme (pas la propre API de l'ORM pour la récupération, s'il en a une). P>
En ce qui concerne les spécifiques mentionnés, voici mes brèves pensées: - NHibernate: Derrière The Times Tech Sage. Beaucoup de maintenance de fichiers de mappage XML (bien que le NHibernate fluide atténue cela). p>
llblgen: la plupart des ormes matures que j'ai travaillé. Facile de démarrer un nouveau projet et d'aller aller. Meilleur designer. Très lourd poids. Riche API très puissante. Meilleure vitesse que j'ai rencontrée. Parce que ce n'est pas le nouveau gamin sur le bloc, certaines des fonctionnalités les plus récentes exploitant de nouvelles technologies ne sont pas implémentées aussi bien qu'elles devraient être (spécifiquement). P> li>
Cadre d'entité: La classe POCO in 4.0 semble prometteuse. 3.5 n'a pas cela et je ne le considérerais même pas. Même en 4.0, ne dispose pas d'un excellent support Linq et génère une pauvre SQL (peut faire des centaines de requêtes de DB pour une seule requête LINQ). Le soutien des concepteurs est faible en ce qui concerne les projets plus importants. p> li>
linq à SQL: Super support Linq (meilleur que tout autre sauf dataObject.net). Prise en charge de la persistance médiocre (sauvegarde / mise à jour). Très léger (POCO). Le support design est pauvre tout autour (sans rafraîchissement de dB). Mauvaise performance sur les requêtes de Linq avancées (peut faire des centaines de requêtes de DB) p> li>
dataObjectS.net: vraiment grand support et performances de Linq. Offre la chose la plus proche que j'ai vue à Poco dans un orme lourd. Technologie vraiment nouvelle, puissante et prometteuse. Très flexible. P> li>
OpenAccess: Je n'ai pas travaillé avec elle une tonne, mais cela me rappelle un peu de Llblgen, mais pas comme une caractéristique riche ou mature. p> li>
Datables: Aucun commentaire P> LI> ul>
Tatables? Que veux-tu dire? Système.data.datatable?
Je pense que vous devriez reclassifier l'entité cadre Poco. Ce n'est certainement pas un cadre "léger" que vous l'avez décrit. Même en utilisant POCO avec EF V4, vous avez la pleine puissance de EF à votre disposition ... vous ne perdez rien, mais n'engagez pas les tracas d'un cadre «lourd» comme Llblgen. Cela est particulièrement vrai si vous utilisez uniquement du code. Votre description du support LINQ et SQL de EFV4 est également très éteinte ... Vous avez décrit les requêtes SQL de EFV1 et la prise en charge LINQ de EFV1 ... Les EFV4 ont été radicalement améliorés.
Je suis fortement en désaccord sur ma description EF étant éteinte. J'ai essayé de faire ce qui suit la semaine dernière: 1. Incluez une valeur d'énorme dans une projection. J'ai vu cela dans des exemples et cela fonctionne à Linq à SQL. Dans EF 4.0, je reçois une exception non valide. 2. Une sous-requête imbriquée s'est associée sur une propriété de la requête principale. LINQ to SQL fonctionne, mais émet une requête par instance de sous-requête), il a donc de très mauvaise performance. EF 4.0 ne fonctionne pas du tout. Jette une exception sur la sous-requête imbriquée étant une constante. DataObjects .NET est le seul orj que j'ai vu exécuter le scénario de sous-pérature imbriqué avec de bonnes performances.
@ Dmitry - Oui, j'ai vu des gens les utiliser comme objets métier.
@jrista: le code n'est que très immature.
Je pense que je suis d'accord frans ... Où ai-je entendu votre nom avant ... :) ... Mais pourriez-vous élaborer?
Pour corriger l'enregistrement sur OpenAccess, il permet également un développement de modèles à base de poco léger et ne nécessite pas de mise en œuvre spécifique de la classe de base. Rapide et plus mature que les outils comme EF. Vaut certainement la peine de regarder.
@Todd: la liste des fonctionnalités indique OpenAccess ne supporte pas actuellement Poco, pourriez-vous s'il vous plaît élaborer? Je serais très intéressé à la vérifier, car je cherchais à OpenAccess il y a quelque temps pour sa couche de cache intéressante.
Après avoir utilisé OpenAccess sur plusieurs projets, je dois dire qu'il répond à tous les critères ci-dessus. Un système que j'ai travaillé était basé sur des services de la WCF parlant à plusieurs types de clients (Smart, Web, d'autres services de la WCF, etc.) via une architecture en couches Les services WCF utilisés ouvertes comme mécanisme de persistance. J'imagine particulièrement la mise à l'échelle que OpenAccess effectue .. Le cache de niveau 2 intelligent 2 (cache L2) fait un travail parfait et il est de cause distribuable. En fait, je n'appellerais pas un poids lourd de l'oa ... vous n'héritez même pas d'une classe de base. Il s'agit également d'un grand avantage qu'il existe des outils pour effectuer les tâches de développement quotidiennes (créez un nouveau schéma de DB, des schémas de fusion, etc.) intégré à Visual Studio. P>
À propos de EF4 ... Veuillez ne pas l'utiliser dans un grand projet, avec de nombreuses tables et beaucoup de données et de nombreux utilisateurs. J'ai fait cette erreur et je cherche maintenant un remplaçant. P>
Génération de la requête Bad 1, en particulier dans les grandes hiérarchies tpt. Préparez-vous pour une requête de 5000 lignes pour une hiérarchie de 15 tables! P>
2-extrêmement lent designer lorsque le nombre de tables grandit. 45 secondes juste pour effondrer / développer une entité dans un modèle avec 240 entités. P>
Problème 3 grave avec X-à-de nombreuses relations. Supposons que vous ayez Si je ne peux pas intégrer mon système avec do.net, je vais chercher un autre, mais cette chose ef, elle doit aller! P> commandez code> et client code>. Chaque commande a un client et chaque client a de nombreuses commandes. Il existe une propriété, nommée commandes code> dans Classement CODE> CLASSE qui sera peuplé sans que vous n'ayez jamais besoin de ces données. Cela signifiait, dans notre système, que des collections jusqu'à 1800000 entités soient extraites sans raison réelle. Lorsque cela se produit à l'intérieur d'une transaction avec un niveau d'isolation d'instantané ... qui apporte tout le système à l'échec. Il n'y a pas de solution réelle à ce problème, une personne qui n'a pas d'inconvénients sérieux. Il suffit de lire la documentation de DataObjectS.NET et voyez comment ils ont pris ce problème. J'ai trouvé que payer 200 ou 500 euros n'est rien comparé à ce que vous obtenez. Je peux même obtenir la version avec code source. P>
stackoverflow.com / Questions / 1377236 / ...