Je suis un peu en retard au jeu et j'ai décidé de passer du temps libre à apprendre Linq. En tant qu'exercice, je vais réécrire une application WebForms dans MVC 2 (qui est également nouvelle pour moi). J'ai réussi à trouver quelques sujets concernant Linq ici ( Apprendre à propos de Linq , Guide de Linq , est LINQ à SQL mort ou en vie? ), qui a suscité la préoccupation des entités vs SQL à mon attention. P>
Les threads sont toutefois de plus d'un an, et je ne peux pas sembler trouver des informations définitives sur lesquelles l'ORM est préférable. Est-ce que des entités sont plus ou moins Linq vers SQL 2.0 à ce stade? Est-il encore plus difficile à utiliser? P>
Y a-t-il une raison d'utiliser LINQ vers SQL, ou devrais-je simplement passer à des entités? Les applications que j'écris à mon employeur actuel ont un long cycle de vie (environ 10 ans), donc j'essaie de choisir la meilleure technologie disponible. P>
5 Réponses :
Dans un article récent sur l'extension nerddinner, Scott Hanselman a parlé de cette chose . Pour citer à la fin: p>
conclusion forte> p> Il y a beaucoup de choix pour la base de données Accès sur .NET. Vous allez rencontrer Datareaders chez les personnes âgées ou très réglées code, mais il n'y a aucune raison qu'il ne peut pas être caché dans un référentiel et toujours être agréable à utiliser. linq à SQL est sympa, léger et rapide et a des dizaines de Corrections de bugs dans .NET 4, mais entité Cadre est la façon dont ils se dirigent à l'avenir. strong> plus, cadre d'entité 4 est façon em> mieux que EF 3.5, donc je suis en l'utilisant pour n'importe quel "plus grand que petit" projets que je fais et je n'ai pas d'avoir beaucoup de problèmes. p> blockQuote>
accordé que je n'ai pas encore eu la chance de jouer beaucoup, mais EF4 semble avoir gagné la confiance d'un certain nombre de pros. p>
+1. EF4 est aussi simple que NHibernate, sans l'incroyable quantité de travail d'installation. J'ai pu obtenir une application de base de données de base en un rien de temps. Beaucoup plus propre que EF sur 3,5. Mais tout dépend de ce que vous voulez; Certaines personnes aiment voir l'abstraction DB en code afin qu'ils comprennent ce qui se passe. L2S est toujours une excellente option et ne serait pas difficile à convertir en EF ultérieurement.
Bonne lecture. J'aime comment il nous a donné un folk archaïque obsolète à l'aide de digne d'administration une belle sortie - "hautement réglée".
@Orlon Je pense que le commentaire DatAreaders était plus valable que sinon, car il vous donne un contrôle plus granulaire de vos déclarations SQL. Même les derniers projets les plus récents et les plus grands peuvent trouver le besoin d'accorder manuellement SQL à un moment ou à un autre. Overflow de pile utilise des digne de données à certains endroits tout en utilisant LINQ vers SQL partout ailleurs. C'est la loi des abstractions qui fuient, je pense ...
Je suggérerais d'aller avec des entités ou de NHibernate, Linq très étroitement couplé la base de données sur vos objets de domaine, qui sont ensuite utilisés par votre couche de présentation. Cela se retrouvera avec un couplage serré de la couche de présentation à la base de données, qui a tendance à ne pas être souhaitable. p>
Personnellement, j'aime l'entité Framework 4.0, vous pouvez utiliser des requêtes LINQ avec des objets IT et POCO que vous vous codez. Il gère simplement toutes les choses de base de données / SQL pour vous. p>
Cet article est similaire à l'article de Hanselman. Il compare DataReader (qu'ils appellent "accès" de données "connectés"), Dataset tapé ("déconnecté"), LINQ vers SQL et Framework. Des exemples de code détaillés sont donnés pour toutes les approches, ainsi que les avantages et les inconvénients de chaque approche. P>
Y a-t-il une raison d'utiliser LINQ vers SQL, ou devrais-je simplement passer à des entités? P>
Je suis à peine objectif (comme un utilisateur de Linqtosql matrice), mais cela est responsable. P>
Les technologies de cartographie relationnelles de l'objet sont des tentatives de résolution ou d'atténuation de l'inadéquation d'impédance relationnelle. Ce sont des ponts entre les deux mondes - le monde de l'objet et le monde des données relationnels. P>
Et il semble que les développeurs de ces ponts appellent généralement un côté ou l'autre, à la maison. P>
LINQTOSQL est un orm du côté objet. Il a été développé par l'équipe C # et vous permet d'utiliser des objets pour représenter des données. Dans LINQTOSQL, il n'y a pas de chaînes opaques compilatrice, toutes les requêtes sont vérifiées par le compilateur contre le mappage. P>
EF est un orm du côté des données. Il a été développé par l'équipe ADO et vous permet d'utiliser des données représentées comme des objets. En EF, il y a beaucoup de chaînes opaques. P>
Les requêtes doivent finalement exécuter une base de données et le compilateur ne peut pas certifier que la base de données disponible au temps d'exécution correspond au mappage (true dans l'une ou l'autre des ormes). En raison de cette réalité du monde des données, l'équipe de données ne value pas la valeur des garanties de compilateur autant que l'équipe C #. P>
ayant travaillé dans un backend TSQL pendant des années, sans la protection d'un compilateur, je me passe Pour valoriser pleinement n'importe quelle aide, le compilateur va me donner. Et alors je suis du côté de l'équipe C # à ce sujet. P>
Par exemple, chargement d'un client avec ses commandes. P>
//linq to sql. DataLoadOptions load = new DataLoadOptions(); load.LoadWith<Customer>(c => c.Orders); //<-- strong typed myDataContext.LoadOptions = load; IQueryable<Customer> query = myDataContext.Customers .Where(c => c.CustomerId == 1); //entity framework IQueryable<Customer> query = myObjectContext.Customers .Include("Orders") // <-- opaque string .Where(c => c.Customer.Id == 1);
Hausser les épaules. C'est si facile de travailler autour de ce que je peux J'imagine pourquoi vous prenez une décision basée sur cette question très mineure. Vous voulez un dactylographié fort inclure code>? Vous pouvez l'avoir. Maintenant, vous pouvez prendre une décision basée sur des questions de fond.
Ce n'est pas une solution complète. Qu'en est-il de Customer.orders.Items?
En outre, la méthode incluse n'est pas le seul cas - le fait demeure que tout au long de leurs bibliothèques, l'équipe C # souhaite une vérification du compilateur et l'équipe ADO ne le fait pas.
Je n'ai pas dit que c'était une solution complète; J'ai dit que c'était un problème trivial de résoudre. Et je vais contester la notion qu'il est en quelque sorte omniprésent. Il n'est pas du tout difficile d'écrire des applications EF qui n'utilisent aucune chaîne magique, tout comme il n'est pas difficile d'écrire des applications L2S qui font. Enfin, disant que l'équipe de l'ADO "ne veut pas" c'est manifestement absurde. I> Juste qui pensez-vous posséder Linq à SQL?
J'ai examiné les deux technologies très étroitement au début de 2009 et j'ai écouté beaucoup de grondements sur la "mort imminente" de Linq-to-SQL. En fin de compte, j'ai toujours choisi Linq-to-SQL sur un cadre d'entité, car je n'ai jamais aimé travailler avec Ado.Net et EF me rappelait trop, car il était si étroitement lié à la base de données. P>
Dans mes projets de développement, mon histoire a toujours été: p>
avec EF, peu de choses changeraient. Avec Linq-To-SQL, j'ai pu éliminer l'étape 2 entièrement de manière à ce que la couche de données parlait directement à la base de données sans avoir à se soucier des relevés SQL dynamiques ou des vulnérabilités d'injection potentielles. De plus, j'ai également gagné le bénéfice d'un processus de gestion des changements beaucoup plus simple au cours du cycle de développement. Je ne me soucie vraiment pas de ce que la position "officielle" de Microsoft est parce que j'ai entendu parler de la "mort imminente" de Winforms pendant environ cinq ans maintenant, et c'est toujours là. p>
Microsoft est une entreprise, avant tout. S'ils veulent rester en affaires, ils donneront au client ce qu'ils désirent ou sinon le client trouvera quelqu'un d'autre plus disposé à répondre à leurs besoins. Si seulement pour les applications héritées qui sont toujours activées aujourd'hui, WinForms sera pris en charge tant que le système d'exploitation Windows prend toujours en charge les applications Windows 95. Dans la même veine, LINQ-TO-SQL continuera d'être pris en charge sous une forme ou une autre. Jusqu'à ce qu'il puisse être fusionné de manière transparente dans EF où les applications existantes seront conçues comme étant conçues à l'origine (ou avec une modification de développeur minimale forte> minimale), je crois que LINQ-TO-SQL est également là pour rester dans un avenir prévisible. p>
Il est bon de revoir cette question maintenant que .NET 4.0 est sorti, avec de nombreuses modifications aux deux technologies.
Dupliquer: Stackoverflow.com/Questions/2874003/...