NHibernate vs LINQ to SQL
Comme quelqu'un qui n'a pas utilisé la technologie sur des projets réels, je me demande si quelqu'un sait comment ces deux complètent les uns les autres et la façon dont beaucoup de leurs fonctionnalités se chevauchent?
Vous devez vous connecter pour publier un commentaire.
LINQ to SQL vous oblige à utiliser la table par classe de modèle. Les avantages de l'utilisation de ce modèle sont qu'il est facile et rapide à mettre en oeuvre et il prend très peu d'efforts pour obtenir votre domaine en cours d'exécution basé sur une base de données existante structure. Pour les applications simples, ce qui est parfaitement acceptable (et souvent même préférable), mais pour des applications plus complexes devs suggèrent souvent à l'aide d'un domain driven design modèle à la place (qui est ce que NHibernate facilite).
Le problème avec la table par classe de modèle, c'est que votre structure de base de données a une influence directe sur votre domaine de conception. Par exemple, disons que vous avez une table avec les colonnes suivantes pour tenir une principal du client des informations d'adresse:
Maintenant, disons que vous souhaitez ajouter des colonnes pour l'adresse postale du client en tant que bien de sorte que vous ajouter dans les colonnes suivantes de la table Clients:
À l'aide de LINQ to SQL, le Client de l'objet dans votre domaine aurait maintenant des propriétés de chacun de ces huit colonnes. Mais si vous étiez à la suite d'un domain driven design pattern, vous aurait probablement créé une Adresse de classe et a votre Client de classe de la tenue de deux propriétés de l'Adresse, une pour l'adresse postale et une adresse actuelle.
C'est un simple exemple, mais il démontre comment la table par classe de modèle peut conduire à un peu malodorante domaine. En fin de compte, c'est à vous. Encore une fois, pour des applications simples qui n'ont besoin que de base CRUD (create, read, update, delete) fonctionnalité, LINQ to SQL est idéal en raison de la simplicité. Mais personnellement, j'aime utiliser des NHibernate, parce qu'elle facilite un nettoyeur de domaine.
Edit: @lomaxx - Oui, l'exemple que j'ai utilisé était simpliste et pourrait avoir été optimisée avec LINQ to SQL. Je voulais le garder aussi simple que possible pour conduire à la maison le point. Le point reste cependant qu'il y a plusieurs scénarios où le fait d'avoir votre structure de base de données de déterminer la structure de votre domaine serait une mauvaise idée, ou au moins conduisent à sous-optimale OO design.
Deux points qui ont été manqués jusqu'à présent:
LINQ to SQL ne fonctionne pas avec Oracle
ou toute base de données en dehors de SqlServer. Cependant 3ème parties offrent un meilleur support pour Oracle, par exemple devArt de dotConnect, DbLinq, Mindscape est LightSpeed et ALinq. (Je n'ai aucune expérience personnelle avec ces)
Linq to NHibernate vous permet de vous servir
Linq avec un Nhiberate, de sorte qu'il peut
supprimer une raison de ne pas utiliser.
Également la nouvelle interface fluide à Nhibernate semble pour le rendre moins pénible à configurer Nhibernate de la cartographie. (La suppression de l'un des points de douleur de Nhibernate)
Mise à jour
Linq to Nhiberate est de mieux en Nhiberate v3 qui est maintenant dans alpha. Ressemble Nhiberate v3 peut expédier vers la fin de cette année.
La Entité Cadre De Travail comme de .net 4 commence à ressembler à une vraie option.
@Kevin: je pense que le problème avec l'exemple que vous présentez est que vous utilisez une mauvaise conception de base de données. J'aurais pensé que tu créer une table client et une table d'adresses et normalisé les tables. Si vous faites cela, vous pouvez certainement utiliser Linq to SQL pour le scénario que vous êtes en train de suggérer. Scott Guthrie a un belle série de posts sur l'utilisation De Linq to SQL qui, je vous suggère fortement de vérifier out.
Je ne pense pas que vous pourriez dire Linq et NHibernate complètent l'une l'autre, ce qui impliquerait qu'ils pourraient être utilisés ensemble, et, si cela est possible, vous êtes beaucoup mieux de choisir un et de s'y tenir.
NHibernate vous permet de mapper les tables de base de données à votre domaine d'objets dans une très flexible. Il permet également d'utiliser des HBL pour interroger la base de données.
Linq to SQL vous permet également de carte de votre domaine d'objets de la base de données cependant d'utiliser la syntaxe de requête Linq pour interroger la base de données
La principale différence ici est que la requête Linq syntaxe est vérifié au moment de la compilation par le compilateur afin de vous assurer que vos requêtes sont valides.
Certaines choses à connaître avec linq, c'est qu'il est uniquement disponible en .net 3.x et est pris en charge uniquement dans VS2008. NHibernate est disponible en 2.0 et 3.x ainsi que VS2005.
Certaines choses pour être au courant de NHibernate, c'est qu'il ne génère pas de votre domaine d'objets, ni de générer les fichiers de mappage. Vous devez faire cela manuellement. Linq peut
faire cela automatiquement pour vous.
Couramment NHibernate pouvez générer vos fichiers de mappage basé sur de simples conventions. Pas de XML-écrit et fortement typé.
J'ai récemment travaillé sur un projet, où nous avions besoin de changer de Linq to SQL pour NHibernate pour des raisons de performances. Surtout L2S la façon de matérialiser les objets semble plus lent que NHibernate de l'idem et de la gestion du changement est très lent aussi. Et il peut être difficile de tourner la gestion du changement off pour des scénarios spécifiques où il n'est pas nécessaire.
Si vous allez utiliser votre entités déconnectées du DataContext - dans WCF scénarios par exemple: vous vous êtes peut-être beaucoup de mal à se connecter au DataContext de nouveau pour mettre à jour les modifications. Je n'ai eu aucun problème avec qui avec NHibernate.
La chose que je vais manquer de L2S est surtout la génération de code qui maintient les relations à jour sur les deux extrémités des entités. Mais je pense qu'il y a des outils pour NHibernate à faire trop...
.ObjectTrackingEnabled = false
sur votreDataContext
aurait résolu votre suivi des modifications question. Aussi longtemps que vous achetez dans l'unité de travail modèle et ne cherche pas à faire DDD, Linq-to-SQL fournit vraiment.Pouvez-vous préciser ce que vous entendez par "LINQ"?
LINQ n'est pas une technologie d'accès aux données, c'est juste une fonctionnalité du langage qui prend en charge l'interrogation en tant que natif de construire. Il peut interroger n'importe quel modèle d'objet qui prend en charge des interfaces spécifiques (par exemple, IQueryable).
Beaucoup de gens se réfèrent à LINQ to SQL que LINQ, mais ce n'est pas du tout correct. Microsoft vient de sortir de LINQ to entities avec .NET 3.5 SP1. En outre, NHibernate a une LINQ interface, de sorte que vous pouvez utiliser LINQ et NHibernate pour obtenir des données à votre.
Par LINQ, je suppose que tu veux dire LINQ to SQL, car LINQ, par lui-même, n'a pas de base de données "allées et venues sur" associés. C'est juste un langage de requête qui a un bateau en charge de la coloration du sucre pour le faire paraître SQL-ish.
Dans les principes de base de la base d'exemples, NHibernate et LINQ to SQL semblent à la fois d'être résoudre le même problème. Une fois que vous obtenez le pass que vous vous rendez vite compte que NHibernate a un support pour un grand nombre de fonctionnalités qui vous permettent de créer vraiment riche en modèles de domaine. Il y a aussi une LINQ to NHibernate projet qui vous permet d'utiliser LINQ pour la requête NHibernate dans beaucoup de la même manière que vous le feriez utiliser LINQ to SQL.
D'abord, permet de séparer deux choses différentes:
Modélisation de base de données est préoccupé par les données, tandis que la modélisation d'objet est préoccupé par les entités et les relations.
Linq-to-SQL avantage est de rapidement générer des classes de schéma de base de données de sorte qu'ils peuvent être utilisés comme active record objets (voir enregistrement actif la conception de la définition du motif).
NHibernate avantage est de permettre une flexibilité entre votre objet de modélisation de base de données et de modélisation. La base de données peut être modélisée en fonction de vos données, en tenant compte de la performance par exemple. Alors que votre objet la modélisation permettra de mieux refléter les éléments de la règle d'entreprise à l'aide d'une approche du type Domain-Driven-Conception. (voir Kevin Pang commentaire)
Avec des bases de données existantes avec les pauvres de la modélisation et/ou conventions de nommage puis Linq-to-SQL sera le reflet indésirable structures et les noms de vos classes. Cependant NHibernate peut cacher ce gâchis avec des données utilisateurs.
Dans des projets entièrement nouveaux, où les bases de données ont la bonne dénomination et de faible complexité, Linq-to-SQL peut être le bon choix.
Cependant, vous pouvez utiliser NHibernate Fluent avec auto-mappings pour ce même but avec la cartographie de la convention. Dans ce cas, vous ne vous inquiétez pas à propos de toutes les données mappeurs avec XML ou C# et laissez NHibernate pour générer le schéma de base de données à partir de votre entités basées sur une convention que vous pouvez personnaliser.
Sur l'autre côté de la courbe d'apprentissage de Linq-to-SQL est plus petit que NHibernate.
Ou vous pouvez utiliser le Château ActiveRecords projet. J'ai été en utilisant que pour un court laps de temps à la rampe jusqu'à quelques nouveau code pour un projet de legs. Il utilise NHibernate et fonctionne sur le modèle d'enregistrement active (surprenant, compte tenu de son nom, je le sais). Je n'ai pas essayé, mais je suppose qu'une fois que vous l'avez déjà utilisé, si vous sentez le besoin de déposer pour NHibernate prise en charge directement, il ne devrait pas être trop beaucoup à faire pour une partie ou la totalité de votre projet.
Comme vous l'avez écrit "pour une personne qui ne l'ont pas utilisé, soit de la leur"
LINQ to SQL est facile à utiliser pour tout, on peut l'utiliser facilement
Elle soutient également les procédures, ce qui permet la plupart du temps.
Supposons que vous voulez obtenir les données de plus d'une table puis écrire une procédure et faites glisser la procédure de designer et il va créer tout pour vous,
Supposons que votre nom de la procédure est "CUSTOMER_ORDER_LINEITEM" qui chercher de l'enregistrement de l'ensemble de ces trois table, alors il suffit d'écrire
vous pouvez utiliser les documents de l'objet dans la boucle foreach, ce qui n'est pas pris en charge par NHibernate