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.