web-dev-qa-db-fra.com

Dapper.Rainbow VS Dapper.Contrib

Quelqu'un peut-il expliquer la différence entre Dapper.Rainbow et Dapper.Contrib?

Je veux dire quand utilisez-vous SqlMapperExtensions.cs de Dapper.Contrib et quand devez-vous utiliser Dapper.Rainbow?

64
Shuaib

J'utilise Dapper depuis un certain temps maintenant et je me suis demandé en quoi consistaient les projets Contrib et Rainbow . Après un peu de révision du code, voici mes réflexions sur leurs utilisations:

Dapper.Contrib

Contrib fournit un ensemble de méthodes d'extension sur l'interface IDbConnection pour les opérations CRUD de base:

  • Get
  • Insérer
  • Mise à jour
  • Supprimer

L'élément clé de Contrib est qu'il fournit un suivi pour vos entités afin d'identifier si des modifications ont été apportées.

Par exemple, l'utilisation de la méthode Get avec une interface comme contrainte de type renvoie une classe proxy générée dynamiquement avec un dictionnaire interne pour suivre les propriétés modifiées.

Vous pouvez ensuite utiliser la méthode Update qui générera le SQL nécessaire pour mettre à jour uniquement les propriétés qui ont changé.

Avertissement majeur : pour obtenir la qualité de suivi de Contrib, vous devez utiliser une interface comme contrainte de type pour permettre à la classe proxy d'être générée.

Dapper.Rainbow

Rainbow est une classe abstraite que vous pouvez utiliser comme classe de base pour vos classes Dapper pour fournir des opérations CRUD de base:

  • Get
  • Insérer
  • Mise à jour
  • Supprimer

Ainsi que certaines méthodes couramment utilisées telles que First (obtient le premier enregistrement dans un tableau) et All (obtient tous les enregistrements de résultats dans un tableau).

À toutes fins utiles, Rainbow est essentiellement un wrapper pour vos interactions de base de données les plus couramment utilisées et construira le SQL ennuyeux en fonction des noms de propriété et des contraintes de type.

Par exemple, avec une opération Get, Rainbow créera une requête Vanilla SQL et renverra toutes les colonnes, puis mappera ces valeurs au type utilisé comme contrainte.

De même, les méthodes d'insertion/mise à jour construisent dynamiquement le SQL nécessaire pour une insertion/mise à jour en fonction des noms de propriété de la contrainte de type.

Avertissement majeur : Rainbow s'attend à ce que toutes vos tables aient une colonne d'identité nommée "Id".

Différences?

La principale différence entre Contrib et Rainbow est (IMO), l'un suit les modifications apportées à vos entités, l'autre ne:

  • Utilisez Contrib lorsque vous souhaitez pouvoir suivre les modifications de vos entités.
  • Utilisez Rainbow lorsque vous souhaitez utiliser quelque chose de plus dans le sens d'une approche ADO.NET standard.

Sur une note: j'aurais aimé avoir étudié Rainbow plus tôt car j'ai construit une classe de base très similaire que j'utilise avec Dapper.


De l'article et cite @anthonyv cité: Ce problème INSERT ennuyeux, obtenir des données dans la base de données

Il y a maintenant 2 autres API que vous pouvez également choisir ( en plus de Rainbow ) (pour CRUD) Dapper.Contrib et Extensions Dapper . Je ne pense pas que ce soit unique. Selon votre problème et vos préférences, il peut exister une API qui vous convient le mieux. J'ai essayé de présenter certaines des options. Il n'y a pas de "meilleure façon" bénie de résoudre tous les problèmes du monde.

Je soupçonne ce que Sam essayait de transmettre dans la citation ci-dessus et le billet de blog correspondant était: Votre scénario peut nécessiter beaucoup de mappage personnalisé (utilisez Vanilla Dapper), ou il peut avoir besoin de suivre les changements d'entité (utiliser Contrib), ou vous pouvez ont des scénarios d'utilisation communs (utilisez Rainbow) ou vous pouvez utiliser une combinaison de tous. Ou même pas utiliser Dapper. YMMV.

73
Metro Smurf

Cet article d'Adam Anderson décrit les différences entre plusieurs bibliothèques d'extension CRUD Dapper:

  • Dapper Contrib (Suivi automatique des modifications - uniquement s'il est sale ou non, Attributs pour le mappage personnalisé, Pas de prise en charge de clé composite, Pas de prise en charge de clé manuelle)
  • Dapper Rainbow (Suivi manuel des modifications à l'aide de Snapshotter, Attributs pour le mappage personnalisé, Pas de prise en charge de clé composite, Pas de prise en charge de clé manuelle)
  • Extensions Dapper (Pas de suivi des modifications, configuration fluide pour le mappage personnalisé, prend en charge les clés composites, prend en charge la spécification manuelle des clés), comprend également un système de prédicat pour les requêtes simples
  • Dapper SimpleCRUD (Pas de suivi des modifications, Attributs pour le mappage personnalisé, Pas de prise en charge de clé composite, Prise en charge de la spécification de clé manuelle), comprend également des aides de filtrage/pagination, prise en charge asynchrone, génération automatique de classe POCO (via T4)

Dapper extensions differences

20
Groo

Sam décrit en détail quelle est la différence dans son article - http://samsaffron.com/archive/2012/01/16/that-annoying-insert-problem-getting-data-into-the-db- using-dapper .

Fondamentalement, sa réponse n'est pas la taille habituelle et convient à tous et c'est à nous de décider quelle approche adopter en fonction de vos besoins:

Il y a maintenant 2 autres API que vous pouvez également choisir ( en plus de Rainbow ) (pour CRUD) Dapper.Contrib et Extensions Dapper . Je ne pense pas que ce soit unique. Selon votre problème et vos préférences, il peut exister une API qui vous convient le mieux. J'ai essayé de présenter certaines des options. Il n'y a pas de "meilleure façon" bénie de résoudre tous les problèmes du monde.

3
anthonyv