Cadre d'entité VS LINQ à SQL VS ADO.NET avec des procédures stockées?
Comment évaluez-vous chacun d'eux en termes de:
- Performance
- vitesse de développement "151930920 Claire, intuitive, facile à gérer le code
- flexibilité
- Global
j'aime mon SQL et ont donc toujours été un die-hard fan de ADO.NET et des procédures stockées, mais j'ai récemment eu un jeu avec Linq to SQL et a été époustouflé par la façon dont rapidement je était en train d'écrire ma couche DataAccess et ont décidé de passer un certain temps vraiment comprendre soit Linq à SQL ou EF... ou aucun des deux?
je veux juste vérifier, qu'il n'y a pas un grand défaut dans aucune de ces technologies qui rendrait mon temps de recherche inutile. Par exemple: la performance est terrible, il est cool pour les applications simples, mais ne peut vous emmener si loin.
mise à Jour: Pouvez-vous vous concentrer sur EF VS L2S VS SPs plutôt que ORM VS SPs? Je suis surtout intéressé par L'EF VS L2S. Mais je suis impatient de les avoir comparés à des procs stockés aussi depuis SQL simple est quelque chose que je connais beaucoup.
4 réponses
tout d'abord, si vous démarrez un nouveau projet, allez avec Entity Framework ("EF") - il génère maintenant beaucoup mieux SQL (Plus comme Linq à SQL does) et est plus facile à entretenir et plus puissant que Linq à SQL ("L2S"). Depuis la sortie de .NET 4.0, je considère Linq to SQL comme une technologie obsolète. Les États membres se sont montrés très ouverts à l'idée de ne pas poursuivre le développement des L2.
1) les Performances
c'est délicat à réponse. Pour la plupart des opérations mono-entités ( CRUD ), vous trouverez des performances à peu près équivalentes avec les trois technologies. Vous devez savoir comment EF et Linq to SQL fonctionnent afin de les utiliser au maximum. Pour les opérations à haut volume comme les requêtes de sondage, vous pouvez avoir EF / L2S "compiler" votre requête d'entité de sorte que le framework n'ait pas à régénérer constamment le SQL, ou vous pouvez courir dans des problèmes d'évolutivité. (voir modifications)
Pour les mises à jour en vrac où vous mettez à jour des quantités massives de données, le SQL brut ou une procédure stockée sera toujours plus performant qu'une solution ORM parce que vous n'avez pas à rassembler les données sur le fil à L'ORM pour effectuer des mises à jour.
2) Vitesse de développement
dans la plupart des scénarios, EF va souffler NU SQL/procs stockés quand il vient à la vitesse de développement. Le concepteur EF peut mettre à jour votre modèle à partir de votre base de données modifications (sur demande), de sorte que vous ne rencontrez pas de problèmes de synchronisation entre votre code objet et votre code de base de données. La seule fois où je ne considérerais pas l'utilisation d'un ORM est lorsque vous faites une application de rapport/tableau de bord où vous ne faites aucune mise à jour, ou lorsque vous créez une application juste pour faire des opérations de maintenance de données brutes sur une base de données.
3) Neat/code Maintenable
Mains vers le bas, EF beats SQL / sprocs. Parce que vos relations sont modélisées, les jointures dans votre code sont relativement rares. Les relations des entités sont presque évidentes pour le lecteur pour la plupart des requêtes. Rien n'est pire que d'avoir à passer du débogage niveau à niveau ou à travers plusieurs SQL/niveau intermédiaire afin de comprendre ce qui se passe réellement avec vos données. EF apporte votre modèle de données dans votre code d'une manière très puissante.
4) flexibilité
Les procsstockés et les SQL bruts sont plus "flexibles". Vous pouvez tirer parti de sprocs et SQL pour générer des requêtes plus rapides pour le cas spécifique Impair, et vous pouvez tirer parti des fonctionnalités de la base de données native plus facilement que vous ne le pouvez avec et ORM.
5) Total
ne vous laissez pas prendre par la fausse dichotomie entre le choix d'un ORM et l'utilisation de procédures stockées. Vous pouvez utiliser les deux dans la même application, et vous devriez probablement. Les opérations en vrac de grande envergure devraient aller dans des procédures stockées ou SQL (qui peut en fait être appelé par L'EF), et EF devrait être utilisé pour vos opérations CRUD et la plupart de vos besoins de niveau intermédiaire. Peut-être que vous choisiriez D'utiliser SQL pour écrire vos rapports. Je crois que la morale de l'histoire est la même comme elle l'a toujours été. Utiliser le bon outil pour le travail. Mais la maigreur de celui-ci est, EF est très bon de nos jours (à partir de .NET 4.0). Passer un peu de temps réel à lire et à comprendre en profondeur et vous pouvez créer quelques applications étonnantes, de haute performance avec facilité.
EDIT : EF 5 simplifie un peu cette partie avec requêtes LINQ auto-compilées , mais pour les choses de volume réel élevé, vous aurez certainement besoin de tester et d'analyser ce qui convient le mieux pour vous dans le monde réel.
procédures stockées:
( ++ )
- grande flexibilité
- contrôle total sur SQL
- la performance La plus élevée disponible
(--)
- exige la connaissance du SQL
- procédures Stockées sont hors de contrôle à la source
- quantité substantielle de" répéter vous-même " tout en spécifiant les mêmes noms de table et de champ. La grande chance de briser l'application après avoir renommé une entité DB et manquer quelques références à elle quelque part.
- développement lent
ORM:
( + )
- développement rapide
- code d'accès aux Données maintenant sous contrôle de code source
- vous êtes isolé de changements dans le DB. Si cela se produit, vous n'avez besoin de mettre à jour votre modèle/mappages qu'en un seul endroit.
(-)
- la Performance est peut-être pire
- pas ou peu de contrôle sur le SQL produit par L'ORM (pourrait être inefficace ou pire buggy). Peut être nécessaire d'intervenir et de le remplacer par des procédures stockées personnalisées. Cela rendra votre code messy (un certain LINQ dans le code, un certain SQL dans le code et/ou dans le DB hors du contrôle source).
- comme toute abstraction peut produire des développeurs de" haut niveau "n'ayant aucune idée de comment cela fonctionne sous le capot
le compromis général est entre avoir une grande flexibilité et perdre beaucoup de temps vs. être limité dans ce que vous pouvez faire mais avoir fait très rapidement.
Il n'y a pas de réponse générale à cette question. C'est une question de guerres saintes. Dépend aussi d'un projet à portée de main et de vos besoins. Ramasser ce qui fonctionne le mieux pour vous.
votre question est essentiellement o / RM's vs main écriture SQL
utilisant un ORM ou un simple SQL?
jetez un coup d'oeil à quelques-unes des autres solutions O/RM là-bas, L2S isn't the only one (NHibernate, ActiveRecord)
http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software
pour répondre aux questions spécifiques:
- dépend de la qualité de la solution o / RM, L2S est assez bon à générer SQL
- c'est normalement beaucoup plus rapide en utilisant un O/RM une fois que vous grok le processus
- Code est aussi généralement beaucoup plus net et plus maintenable
- Straight SQL vous donnera bien sûr plus de flexibilité, mais la plupart des O/RM peuvent faire toutes les requêtes sauf les plus compliquées
- dans L'ensemble, je suggère d'aller avec un o/RM, le la perte de flexibilité est négligeable
LINQ-to-SQL est une technologie remarquable qui est très simple à utiliser, et génère généralement de très bonnes requêtes à l'arrière. LINQ-to-EF a été prévu pour le supplanter, mais historiquement a été extrêmement clunky à utiliser et généré SQL de loin inférieure. Je ne connais pas la situation actuelle, mais Microsoft a promis de migrer toute la bonté de L2S dans L2EF, donc peut-être que tout est mieux maintenant.
personnellement, je n'aime pas les outils ORM (voir ma diatribe ici pour les détails), et donc je ne vois aucune raison de favoriser L2EF, puisque L2S me donne tout ce que je m'attends à avoir besoin d'une couche d'accès aux données. En fait, je pense même que les fonctionnalités L2S tels que des mappings fabriqués à la main et la modélisation de l'héritage ajoutent une complexité complètement inutile. Mais c'est juste moi. ;- )