Entity Framework vs LINQ to SQL

Maintenant que .NET v3.5 SP1 est sorti (avec VS2008 SP1), nous avons maintenant access à la structure d’entité .NET.

Ma question est la suivante. Lorsque vous essayez de décider d’utiliser Entity Framework ou LINQ to SQL en tant qu’ORM, quelle est la différence?

Si je comprends bien, Entity Framework (utilisé avec LINQ to Entities) est un «grand frère» de LINQ to SQL? Si tel est le cas, quels sont les avantages? Que peut-il faire que LINQ to SQL ne peut pas faire seul?

LINQ to SQL ne prend en charge que 1 à 1 mappage des tables de firebase database, des vues, des sprocs et des fonctions disponibles dans Microsoft SQL Server. C’est une excellente API à utiliser pour la construction rapide d’access aux données à des bases de données SQL Server relativement bien conçues. LINQ2SQL a été publié pour la première fois avec C # 3.0 et .Net Framework 3.5.

LINQ to Entities (ADO.Net Entity Framework) est une API ORM (Object Relational Mapper) qui permet une définition large des modèles de domaine object et de leurs relations avec de nombreux fournisseurs de données ADO.Net. En tant que tel, vous pouvez combiner différents fournisseurs de bases de données, serveurs d’applications ou protocoles pour créer un mélange d’objects regroupant des tables, des sources, des services, etc. ADO.Net Framework a été publié avec le .Net Framework 3.5 SP1.

Ceci est un bon article d’introduction sur MSDN: Présentation de LINQ to Relational Data

Je pense que la réponse rapide et sale est que

  • LINQ to SQL est le moyen rapide et facile de le faire. Cela signifie que vous allez aller plus vite et livrer plus rapidement si vous travaillez sur quelque chose de plus petit.
  • Entity Framework est le moyen le plus simple et le plus sûr de le faire. Cela signifie que vous allez prendre plus de temps à l’avance, développer plus lentement et avoir plus de flexibilité si vous travaillez sur quelque chose de plus grand.

LINQ to SQL est-il vraiment mort? par Jonathan Allen pour InfoQ.com

Matt Warren décrit [LINQ to SQL] comme quelque chose qui “n’était même pas censé exister”. Essentiellement, il était juste supposé être prêt à les aider à développer LINQ jusqu’à ce que le véritable ORM soit prêt.

L’échelle d’Entity Framework lui a fait manquer l’échéance de .NET 3.5 / Visual Studio 2008. Il a été achevé à temps pour le malheureusement nommé “.NET 3.5 Service Pack 1”, qui ressemblait plus à une version majeure qu’à un service pack.

Les développeurs n’aiment pas [ADO.NET Entity Framework] en raison de sa complexité.

À partir de .NET 4.0, LINQ to Entities sera la solution d’access aux données recommandée pour LINQ aux scénarios relationnels.

Il y a un certain nombre de différences évidentes décrites dans cet article @lars posté, mais la réponse courte est:

  • L2S est étroitement lié – propriété d’object à un champ spécifique de la firebase database ou plus correctement à un mappage d’object à un schéma de firebase database spécifique
  • L2S fonctionnera uniquement avec SQL Server (pour autant que je sache)
  • EF permet de mapper une seule classe sur plusieurs tables
  • EF va gérer les relations MM
  • EF pourra cibler n’importe quel fournisseur de données ADO.NET

La prémisse originale était que L2S est pour le développement rapide, et EF pour plus d’applications n-tiers «d’entreprise», mais cela vend un peu moins de L2S.

LINQ to SQL

  1. Source de données homogène: SQL Server
  2. Recommandé pour les petits projets uniquement lorsque la structure des données est bien conçue
  3. Le mappage peut être modifié sans recompilation avec SqlMetal.exe
  4. .dbml (langage de balisage de firebase database)
  5. Mise en correspondance individuelle entre tables et classes
  6. Soutient l’inheritance TPH
  7. Ne supporte pas les types complexes
  8. Approche par stockage
  9. Vue centrée sur la firebase database d’une firebase database
  10. Créé par l’équipe C #
  11. Prévu mais pas d’autres améliorations prévues

Cadre d’entité

  1. Heterogeneus datasource: Supporter de nombreux fournisseurs de données
  2. Recommandé pour tous les nouveaux projets sauf:
    • petits (LINQ to SQL)
    • lorsque la source de données est un fichier plat (ADO.NET)
  3. Le mappage peut être modifié sans recompilation lors de la définition du modèle et des fichiers de mappage Processus d’artefact de métadonnées à copier dans le répertoire de sortie
  4. .edmx (Entity Data Model) qui contient:
    • SSDL (Langage de définition du schéma de stockage)
    • CSDL (Langage de définition de schéma conceptuel)
    • MSL (Mapping Specification Language)
  5. Mappages un à un, un à plusieurs, plusieurs à un entre tables et classes
  6. Prend en charge l’inheritance:
    • TPH (tableau par hiérarchie)
    • TPT (tableau par type)
    • TPC (tableau par classe de béton)
  7. Prend en charge les types complexes
  8. Approches Code-first, Model-first, Storage-first
  9. Vue centrée sur l’application d’une firebase database
  10. Créé par l’équipe SQL Server
  11. L’avenir des API Microsoft Data

Voir également:

  • LINQ to SQL Vs Entity Framework
  • Différence entre LINQ to SQL et Entity Framework
  • Entity Framework vs LINQ TO SQL

Mon expérience avec Entity Framework a été moins que remarquable. Tout d’abord, vous devez hériter des classes de base EF, alors dites au revoir aux POCO. Votre design devra être autour de l’EF. Avec LinqtoSQL, je pourrais utiliser mes objects métier existants. De plus, il n’y a pas de chargement paresseux, vous devez l’implémenter vous-même. Il existe des solutions pour utiliser les POCO et le chargement paresseux, mais ils existent à mon humble avis car EF n’est pas encore prêt. Je compte y revenir après 4.0

J’ai trouvé une très bonne réponse ici qui explique quand utiliser quoi en termes simples:

La règle de base pour la structure à utiliser consiste à planifier la modification de vos données dans votre couche de présentation.

  • Linq-To-Sql – utilisez cette structure si vous prévoyez de modifier une relation un-un de vos données dans votre couche de présentation. Cela signifie que vous ne prévoyez pas de combiner des données provenant de plusieurs tables dans une vue ou une page.

  • Entity Framework – utilisez cette structure si vous prévoyez de combiner des données provenant de plusieurs tables de votre vue ou de votre page. Pour rendre cela plus clair, les termes ci-dessus sont spécifiques aux données qui seront manipulées dans votre vue ou votre page, et pas seulement affichées. C’est important à comprendre.

Avec Entity Framework, vous pouvez “fusionner” les données regroupées pour les présenter à la couche de présentation sous une forme modifiable, puis, lorsque ce formulaire est soumis, EF saura comment mettre à jour TOUTES les données des différentes tables.

Il y a probablement des raisons plus précises de choisir EF plutôt que L2S, mais ce serait probablement le plus facile à comprendre. L2S n’a pas la capacité de fusionner les données pour la présentation des vues.

Mon impression est que votre firebase database est très riche ou très mal conçue si Linq2Sql ne répond pas à vos besoins. J’ai environ 10 sites Web à la fois plus grands et plus petits utilisant Linq2Sql. J’ai regardé et Entity Framework plusieurs fois mais je ne trouve pas une bonne raison de l’utiliser sur Linq2Sql. Cela dit, j’essaie d’utiliser mes bases de données comme modèle, donc j’ai déjà un mappage 1 à 1 entre le modèle et la firebase database.

Dans mon travail actuel, nous avons une firebase database avec plus de 200 tables. Une ancienne firebase database avec beaucoup de mauvaises solutions donc je pouvais voir les avantages d’Entity Framework par rapport à Linq2Sql mais je préférerais toujours refondre la firebase database car la firebase database est le moteur de l’application et que la firebase database est mal conçue sera également lent. L’utilisation du framework Entity sur une telle firebase database semble être un quickfix pour masquer le mauvais modèle, mais il ne pourrait jamais masquer les mauvaises performances que vous obtenez d’une telle firebase database.

Les réponses ici ont couvert plusieurs des différences entre Linq2Sql et EF, mais il y a un point clé qui n’a pas reçu beaucoup d’attention: Linq2Sql ne supporte que SQL Server alors qu’EF a des fournisseurs pour les SGBDR suivants:

Fourni par Microsoft:

  • Pilotes ADO.NET pour SQL Server, OBDC et OLE DB

Via des fournisseurs tiers:

  • MySQL
  • Oracle
  • DB2
  • VistaDB
  • SQLite
  • PostgreSQL
  • Informix
  • U2
  • Sybase
  • Synergex
  • Oiseau de feu
  • Npgsql

pour en nommer quelques-uns.

Cela fait d’EF une abstraction de programmation puissante par rapport à votre magasin de données relationnel, ce qui signifie que les développeurs ont un modèle de programmation cohérent avec lequel travailler indépendamment du magasin de données sous-jacent. Cela pourrait être très utile dans les situations où vous développez un produit dont vous souhaitez assurer l’interopérabilité avec un large éventail de SGBDR courants.

Une autre situation dans laquelle l’abstraction est utile est celle où vous faites partie d’une équipe de développement qui travaille avec différents clients ou différentes unités commerciales au sein d’une organisation et que vous souhaitez améliorer la productivité des développeurs en réduisant le nombre de SGBDR. familier afin de prendre en charge une gamme d’applications différentes sur différents SGBDR.

J’ai constaté que je ne pouvais pas utiliser plusieurs bases de données dans le même modèle de firebase database lorsque j’utilisais EF. Mais dans linq2sql, je pouvais simplement préfixer les noms de schéma avec les noms de firebase database.

C’était l’une des raisons pour lesquelles j’ai commencé à travailler avec linq2sql. Je ne sais pas si EF a encore permis cette fonctionnalité, mais je me souviens avoir lu qu’il était destiné à ne pas permettre cela.

Si votre firebase database est simple et directe, LINQ to SQL fera l’affaire. Si vous avez besoin d’entités logiques / abstraites sur vos tables, choisissez Entity Framework.

Ni l’un ni l’autre ne prend en charge les types de données SQL 2008 uniques. La différence de mon sharepoint vue est que Entity a encore une chance de construire un modèle autour de mon type de données géographique dans une prochaine version, et que Linq to SQL, étant abandonné, ne le sera jamais.

Je me demande quoi de neuf avec nHibernate ou OpenAccess …

Je pense que si vous avez besoin de développer quelque chose de rapide sans des choses étranges au centre, et que vous avez besoin de la possibilité d’avoir des entités représentant vos tables:

Linq2Sql peut être un bon allié, l’utiliser avec LinQ libère un bon timing de développement.

Je travaille pour un client qui a un gros projet qui utilise Linq-to-SQL. Lorsque le projet a démarré, c’était le choix évident, car Entity Framework manquait de fonctionnalités majeures à ce moment-là et les performances de Linq-to-SQL étaient beaucoup plus rapides.

Maintenant, EF a évolué et Linq-to-SQL manque d’une fonctionnalité majeure pour les services hautement évolutifs, à savoir la prise en charge des opérations asynchrones. Nous avons parfois plus de 100 requêtes par seconde et malgré l’optimisation de nos bases de données, la plupart des requêtes prennent encore plusieurs millisecondes. En raison des appels de firebase database synchrones, le thread est bloqué et non disponible pour les autres demandes.

Nous pensons à passer à Entity Framework, uniquement pour cette fonctionnalité. Il est dommage que Microsoft n’ait pas implémenté le support asynchrone dans Linq-to-SQL (ou ouvert, de sorte que la communauté puisse le faire).

LINQ to SQL et Entity Framework sont similaires en surface. Ils fournissent tous deux des requêtes LINQ sur une firebase database en utilisant un modèle de données.

LINQ to SQL a évolué à partir du projet LINQ, issu du travail en équipe sur le développement du langage. Entity Framework était un projet de l’équipe de programmabilité des données et était axé sur le langage Entity SQL. Microsoft n’a aucune intention de déprécier LINQ to SQL.

LINQ to SQL est toujours la partie de ADO.NET tandis que le framework Entity dispose d’une API séparée. Entity Framework est la version supérieure de LINQ to SQL.Entity Framework utilise Entity Data Model pour établir un pont entre votre application et votre magasin de données. C’est le modèle de données d’entité, ou EDM, qui fournit la définition de votre schéma conceptuel ainsi que les informations de schéma de firebase database nécessaires pour interagir avec la firebase database et enfin un schéma de mappage qui est lié à deux.

Voici quelques tâches effectuées par Entity Framework (modèle de données d’entité).

• Génère automatiquement des classes à partir du modèle et met à jour ces classes dynamicment chaque fois que le modèle change.

• S’occupe de toute la connectivité de la firebase database afin que les développeurs n’aient pas à écrire beaucoup de code pour interagir avec la firebase database.

• Fournit une syntaxe de requête commune pour interroger le modèle, pas la firebase database, puis traduit ces requêtes en requêtes pouvant être comsockets par la firebase database.

• Fournit un mécanisme de suivi des modifications apscopes aux objects du modèle au fur et à mesure de leur utilisation dans les applications et gère les mises à jour de la firebase database.

Linq-to-SQL

Il est fournisseur, il prend en charge uniquement SQL Server. Il s’agit d’une technologie de mappage permettant de mapper des tables de firebase database SQL Server avec des objects .NET. Est la première tentative de Microsoft à un ORM – Object-Relational Mapper.

Linq-to-Entities

Est la même idée, mais en utilisant Entity Framework en arrière-plan, comme l’ORM – encore une fois à partir de Microsoft, il prend en charge plusieurs bases de données sans avoir à apprendre la syntaxe pour effectuer des opérations sur différentes bases de données

Selon mon expérience personnelle, Ef est meilleur (si vous n’avez aucune idée de SQL), les performances de LINQ sont un peu plus rapides que celles du langage LINQ d’EF reason écrit en lambda.