2012-04-05 10 views
61

Por favor alguien puede explicar la diferencia entre Dapper.Rainbow vs Dapper.Contrib?Dapper.Rainbow VS Dapper.Contrib

Me refiero a cuándo se usa SqlMapperExtensions.cs de Dapper.Contrib y cuándo se debe usar Dapper.Rainbow?

Respuesta

64

He estado usando Dapper desde hace un tiempo y se han preguntado lo que los Contrib y Rainbow proyectos estaban sobre mí. Después de un poco de revisión de código, aquí están mis pensamientos sobre sus usos:

Dapper.Contrib

Contrib proporciona un conjunto de métodos de extensión en la interfaz IDbConnection para las operaciones básicas CRUD:

  • Obtener
  • Insertar
  • actualización
  • Eliminar

El componente clave de Contrib es que proporciona un seguimiento para que sus entidades identifiquen si se han realizado cambios.

Por ejemplo, usar el método Get con una interfaz como restricción de tipo devolverá una clase proxy generada dinámicamente con un diccionario interno para rastrear qué propiedades han cambiado.

A continuación, puede utilizar el método de actualización que generará el SQL necesario para actualizar únicamente las propiedades que han cambiado.

Major Caveat: para obtener la bondad de seguimiento de Contrib, debe usar una interfaz como su restricción de tipo para permitir que se genere la clase de proxy.

Dapper.Rainbow

arco iris es una clase abstracta que se puede utilizar como una clase base para sus clases Dapper para proporcionar operaciones CRUD básicas:

  • Obtener
  • Insertar
  • actualización
  • Eliminar

Además de algunos métodos de uso común como First (obtiene el primer registro en una tabla) y All (obtiene todos los resultados rec ords en una mesa).

Para todos los efectos, Rainbow es básicamente un contenedor para las interacciones de base de datos más utilizadas y creará el SQL aburrido basado en nombres de propiedad y restricciones de tipo.

Por ejemplo, con una operación Get, Rainbow creará una consulta SQL de vanilla y devolverá todas las columnas y luego asignará esos valores al tipo utilizado como restricción.

De forma similar, los métodos de inserción/actualización crearán dinámicamente el SQL necesario para una inserción/actualización basada en los nombres de propiedad de la restricción de tipo.

Major Caveat: Rainbow espera que todas sus tablas tengan una columna de identidad llamada "Id".

¿Diferencias?

La principal diferencia entre Contrib y Rainbow es (OMI), un seguimiento de los cambios a sus entidades, el otro no:

  • Uso Contrib cuando se quiere ser capaz de realizar un seguimiento de los cambios en sus entidades.
  • Utilice Rainbow cuando desee usar algo más como un enfoque estándar de ADO.NET.

En una nota al margen: Ojalá hubiera mirado antes a Rainbow ya que he construido una clase base muy similar que uso con Dapper.


Desde el artículo y la cita @anthonyv citó: That annoying INSERT problem, getting data into the DB

En la actualidad hay otros 2 API se puede elegir también (además del arco iris ) (ABM) para Dapper. Contrib y Dapper Extensions. No creo que sea el mismo para todos. Dependiendo de su problema y las preferencias de , puede haber una API que funcione mejor para usted. Traté de presentar algunas de las opciones. No existe una bendita "mejor manera" de resolver todos los problemas del mundo.

Sospecho lo que Sam estaba tratando de transmitir en la cita anterior y la entrada de blog relacionada fue: Su escenario puede requerir una gran cantidad de asignación personalizada (utilizar la vainilla Dapper), o puede que tenga que realizar un seguimiento de los cambios de entidad (uso Contrib), o puede tener escenarios de uso común (use Rainbow) o puede usar una combinación de todos ellos.O ni siquiera usas Dapper. YMMV.

+1

También hay Dapper.SimpleCRUD https://github.com/ericdc1/Dapper.SimpleCRUD –

3

Sam describe en detalle cuál es la diferencia en su publicación - http://samsaffron.com/archive/2012/01/16/that-annoying-insert-problem-getting-data-into-the-db-using-dapper.

Básicamente, es el habitual no 1 talla única respuesta y depende de nosotros para decidir qué enfoque para ir con base en sus necesidades:

En la actualidad hay otros 2 API se puede elegir también (además de Rainbow) (para CRUD) Dapper.Contrib y Dapper Extensions. No creo que sea el mismo para todos. Dependiendo de su problema y las preferencias de , puede haber una API que funcione mejor para usted. Traté de presentar algunas de las opciones. No existe una bendita "mejor manera" de resolver todos los problemas del mundo.

+13

no veo donde Sam describe la diferencia en su puesto. Él describe a Dapper.Rainbow luego menciona que también hay Dapper.Contrib. Pero, ¿cuál es la diferencia real entre las dos implementaciones? –

14

This post by Adam Anderson describe las diferencias entre varios CRUD bibliotecas de extensión Dapper:

  • Dapper Contrib (seguimiento de cambios automática - solamente si está sucio o no, los atributos de asignación personalizada, No hay soporte clave compuesta, Sin clave de soporte manual)
  • Dapper Rainbow (Seguimiento de cambio manual utilizando Snapshotter, Atributos para mapeo personalizado, Sin soporte de clave compuesta, Sin soporte de clave manual)
  • Dapper Extensions (Sin seguimiento de cambios, Configuración fluida para asignación personalizada, Admite claves compuestas, Sup Especificación de clave manual de puertos), también incluye un sistema de predicado para consultas simples
  • Dapper SimpleCRUD (Sin seguimiento de cambios, Atributos para mapeo personalizado, Sin soporte de clave compuesta, Admite especificación de clave manual), también incluye ayudantes de filtrado/paginación, soporte asíncrono, automático POCO generación de la clase (a T4)

Dapper extensions differences

+0

¡Hola! ¿Hay alguna forma de obtener los datos rastreados usando Dapper.Contrib? Por ejemplo, quiero verificar los valores "antiguos" y "nuevos" en los campos modificados antes de realizar una actualización a la base de datos. ¡Gracias! –

+0

Según lo que veo en [source] (https://github.com/StackExchange/Dapper/blob/master/Dapper.Contrib/SqlMapperExtensions.cs) a partir del 11/2017, Dapper Contrib solo tiene un 'IProxy.IsDirty 'bandera que se establece si se modifica alguna de las propiedades del objeto" rastreado ". Entonces, lo único que hace 'Update' es que comprueba si' IsDirty' es 'true', y luego actualiza todas las columnas. Dapper.Rainbow "Snapshotter" es probablemente la herramienta que está buscando. – Groo

+0

Ya he probado Snapshotter, pero quiero algo hecho en Dapper. Con Snapshotter tengo que crear la lógica para comparar los campos modificados, etc. Gracias. Por favor, marque esto si lo desea, creé este hilo: https://github.com/StackExchange/Dapper/issues/876 –

Cuestiones relacionadas