68 votes

N ' t Linq to SQL ne manquez le point ? Aren ' solutions moins qu’optimales de t ORM-mappeurs (subsonique, etc.) ?

J'aimerais que la communauté de prendre quelques réflexions que j'ai eu à propos de Linq to Sql et d'autres ORM mappeurs.

J'aime Linq to Sql et l'idée d'exprimer la logique d'accès aux données (ou les opérations CRUD en général) dans votre développement natif de la langue plutôt que d'avoir à faire face à "l'adaptation d'impédance" entre C# et SQL. Par exemple, pour retourner un ObjectDataSource-compatible liste des instances d'Événements pour une couche de gestion, nous utilisons:

return db.Events.Select(c => new EventData() { EventID = c.EventID, Title = c.Title })

Si je devais mettre en œuvre ce à l'aide de vieux SQL pour C# constructions, je dois créer une classe Commande, ajoutez le paramètre id de l'événement (à l'aide d'une chaîne de caractères pour décrire le "@id de l'événement" argument), ajouter la chaîne de requête SQL à la classe de Commande, exécutez la commande, et ensuite utiliser (cast-type)nwReader["FieldName"] retirer chaque retourné valeur du champ et de l'attribuer à un membre d'une instance nouvellement créée de mes EventData classe (beurk).

Donc, c' est pourquoi des gens comme Linq/SubSonic/etc. et je suis d'accord.

Cependant, dans l'image plus grande, je vois un certain nombre de choses qui sont fausses. Mon sentiment est que Microsoft voit aussi quelque chose de mal et c'est pourquoi ils sont en tuant Linq to SQL et en essayant de déplacer des personnes à Linq to entities. Seulement, je pense que Microsoft est de doubler vers le bas sur un mauvais pari.

Alors, quel est le problème?

Le problème, c'est qu'il y a de l'architecture des astronautes, en particulier chez Microsoft, qui cherche à Linq to Sql et réaliser qu'il n'est pas un véritable outil de gestion de données: il y a encore beaucoup de choses que vous ne pouvez pas faire facilement des confortablement en C# et ils visent à corriger. Vous voyez cela se manifeste dans les ambitions derrière Linq to entities, les posts sur le révolutionnaire de la nature de Linq et même la LinqPad défi.

Et le problème c' est qu'il suppose que le SQL est le problème. C'est, dans le but de réduire un léger inconfort (adaptation d'impédance entre SQL et C#), Microsoft a proposé l'équivalent d'une combinaison spatiale (isolation complète) lorsqu'un band-aid (Linq to SQL ou quelque chose de similaire) ferait l'affaire.

Aussi loin que je peux voir, les développeurs sont tout à fait assez intelligent pour maîtriser le modèle relationnel et l'appliquer intelligemment dans leurs efforts de développement. En fait, j'irais même plus loin et dire que Linq to SQL, Subsonique, etc. sont déjà trop complexe: la courbe d'apprentissage n'est pas très différent de la maîtrise de SQL lui-même. Depuis, pour l'avenir prévisible, les développeurs doivent maître SQL et le modèle relationnel, nous sommes maintenant confrontés à l'apprentissage de deux requêtes / CRUD langues. Pire encore, Linq est souvent difficile à tester (vous n'avez pas une fenêtre de requête), nous supprime une couche de la véritable travail que nous sommes en train de faire (il génère le SQL), et a très maladroit de soutien (au mieux) pour SQL construit comme la Date de manipulation (p. ex. DateDiff), "Avoir" et même "Groupe".

Quelle est l'alternative? Personnellement, je n'ai pas besoin d'un autre modèle d'accès aux données, comme Linq to entities. Je préfère simplement apparaître une fenêtre dans Visual Studio, saisir et valider mon SQL, puis appuyez sur un bouton pour générer ou de compléter une classe C# pour encapsuler l'appel. Puisque vous savez déjà SQL, ne serait pas vous préférez taper quelque chose comme ceci:

Select EventID, Title From Events Where Location=@Location

et à la fin avec un EventData classe A) contient l'id de l'événement et les champs Titre que les propriétés et B) a une usine méthode qui prend un "Emplacement" chaîne comme argument et qui génère une Liste de<EventData>? Vous devez réfléchir soigneusement sur le modèle de l'objet (l'exemple ci-dessus n'est évidemment pas traiter avec que), mais l'approche fondamentale de encore à l'aide de SQL, tout en éliminant les différences d'impédance me plaît beaucoup.

La question est: ai-je tort? Devraient Microsoft réécrire le SQL de l'infrastructure, de sorte que vous n'avez pas à apprendre le SQL / gestion des données relationnelles? Peuvent ils réécrivent SQL infrastructure de cette façon? Ou pensez-vous qu'une couche très mince sur le dessus de SQL afin d'éliminer la douleur de la configuration des paramètres et l'accès aux données des champs est tout à fait suffisant?

Mise à jour que je voulais pour promouvoir deux liens en haut parce que je pense qu'ils captent des aspects importants de ce que je suis après. Tout d'abord, CodeMonkey souligne un article intitulé "Le Vietnam de l'Informatique." Il faut un certain temps pour démarrer, mais est une lecture très intéressante. Deuxièmement, AnSGri points à l'une de Joel Spolsky plus éminents pièces: La Loi des Abstractions qui fuient. Ce n'est pas exactement le sujet, mais il est proche et est une excellente lecture.

Mise à jour 2: j'ai donné la "réponse" à ocdecio bien qu'il y a beaucoup de réponses ici, et le choix de la "bonne" réponse est purement subjectif. Dans ce cas, sa réponse au carré avec ce que je pense est vraiment la meilleure pratique compte tenu de l'état actuel de la technologie. C'est un domaine que je m'attends à évoluer, cependant, les choses pourraient bien changer. Je tiens à remercier tous ceux qui ont contribué, j'ai upvoted tout le monde qui je pense a donné une réponse réfléchie.

45voto

SquareCog Points 12947

Permettez-moi de commencer par dire que je suis un teints-dans-le-laine de la base de données gars.

Comme une grossière généralisation: les Développeurs ne sais pas SQL. Les développeurs n'ont pas vraiment envie de connaître SQL. Ils peuvent l'écrire, ils peuvent concevoir des tables, mais il les fait se sentir dégueulasse. Ils ont tendance à faire des choses stupides quand la nécessaire requête est plus qu'une simple jointure. Pas parce que les développeurs sont stupides, parce qu'ils ne peuvent pas être dérangé. Ils aiment vivre dans un monde où ils n'ont à traiter avec le concept de l'espace; le déplacement d'objets à des tables et à l'arrière est un changement de contexte le prix pour lequel ils n'aiment pas payer.

Cela ne signifie pas qu'ils sont mauvais, ou le mal; cela signifie qu'il ya une possibilité d'amélioration. Si vos clients (dans ce cas, les développeurs à l'aide de votre cadre) n'aime pas le SQL et les tables -- donnez-leur une couche d'abstraction qui leur permet de sortir sans traiter le désordre sous-jacent.

C'est la même logique qui fait la collecte des ordures / automatisé de gestion de la mémoire d'un grand succès. Oui, les développeurs peuvent traiter avec elle; oui, ils peuvent écrire du code qui est mieux optimisé sans elle; mais ne pas avoir à traiter avec elle les rend plus heureux et plus productifs.

36voto

Jim Anderson Points 2702

Je pense que la popularité d’ORM a été engendrée par les développeurs de développer des couches de données et écrire le même code CRUD maintes et maintes à nouveau la demande après l’application. Orm est juste un autre outil/technologie qui permet aux développeurs de passer moins de temps à écrire les instructions SQL mêmes encore et encore et se concentrer sur la logique de l’application à la place (j’espère).

18voto

Otávio Décio Points 44200

Pendant au moins 6 ans j’ai utilisé mon propre ORM qui repose sur un concept très simple : projection. Chaque table est projeté dans une classe, et SQL est généré à la volée, selon la définition de classe. Il faut encore me connaître SQL mais il prend en charge les 90 % simple CRUD et j’ai jamais eu à gérer des connexions, etc. - et cela fonctionne pour les principaux vendeurs de DB.

Je suis heureux avec ce que j’ai et n’ai pas trouvé quoi que ce soit une valeur d’une chute pour.

12voto

Frederik Gheysels Points 36354

À mon humble avis, OU/M n'est pas seulement à propos de saisie SQL " ou le masquage de SQL, ou l'activation du mode multi-support de SGBD.

Il vous permet de mettre davantage l'accent sur votre domaine de problème, puisque vous avez passé moins de temps à l'écriture de l'ennuyeux CRUD des requêtes SQL. D'autre part, si vous utilisez un bien OU d'/M OU M/devrait vous permettre d'écrire des requêtes SQL, si cela semble nécessaire.

Un OU/M peut être un outil puissant si vous l'utilisez correctement, il peut prendre soin de chargement paresseux, des requêtes polymorphiques / associatons ...
Ne m'obtenez pas le mal; il n'y a rien de mal avec la plaine SQL, mais, si vous avez à prendre soin vous-même de la traduction de votre (bien pensé et normalisée) modèle relationnel d'une force expressive OO/modèle de domaine, puis je pense que vous avez passer beaucoup trop de temps à faire de la plomberie.

À l'aide d'un OU/M ne signifie pas que vous-en tant que développeur devrait avoir aucune connaissance de SQL. Le contraire est vrai, à mon humble avis.
Sachant SQL et de savoir comment écrire un efficace de requêtes SQL, à mon humble avis - de vous permettre d'utiliser un OU/M correctement.

Je dois aussi avouer que je suis en train d'écrire ce avec NHibernate à l'esprit. C'est le M que je suis en utilisant un guichet automatique, et je n'ai pas utilisé de Linq to SQL ou Linq to entities (encore).

10voto

Trevor Abell Points 447

Linq est la conception et le linq to entities cadre a certainement utilise comme un outil orm, mais la grande idée, c'est qu'il sera utilisé comme une api commune à la requête de TOUTE source de données, et pas seulement du SGBDR.

Je me souviens avoir lu que linq, bien que conçu avec SQL à l'esprit, est destiné à être un langage de requête pour n'importe quel magasin de données. Vous pouvez écrire des requêtes linq pour SQL, mais vous pouvez également théoriquement écrire des requêtes linq qui cible ldap, système de fichiers, de change, services web, à l'infini. Vous ne pouvez pas utiliser SQL pour ces programmes.

Vous avez aussi besoin d'apprendre une autre API pour presque tous les magasin de données. Linq donne à chacun un objectif commun de créer un accès aux données de l'API.

Si cette vision fonctionne ou non reste à voir, mais c'est l'idée. Je pense que nous voulons que les systèmes fonctionnent plus et en plus on peut trouver de très belles utilise pour l2e.

Je vais ajouter quelques références si je peux les retrouver.

http://laribee.com/blog/2007/03/17/linq-to-entities-vs-nhibernate/

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